home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / tools / czesc_1 / bangermenu / bangermenu.asm < prev    next >
Assembly Source File  |  1984-08-28  |  77KB  |  1,938 lines

  1. ;Programm: BangerMenu bietet eine grafische Oberfläche zum Anwählen von Programmen
  2. ;          die beim Starten in der Startup-Sequence aufgerufen werden sollen.
  3. ;Autor   : Andre´ Trettin
  4. ;Codename: Banger
  5. ;Begin   : 31-Mai-95 17:08:28
  6. ;$VER    : BangerMenu.Asm 3.3 (4-Sep-96)
  7.  
  8. ** INCLUDE Struktur Variablen
  9. * Fehler Codes: 21=kein Speicher
  10. *               22=konnte Library (oder Libraries) nicht öffnen
  11. *               23=GetVisualInfo Fehler
  12. *               24=konnte File S:BangerMenu.Prefs nicht öffnen
  13. *               25=bei der Gadgeterschaffung trat ein Fehler auf
  14. *               26=konnte Fenster nicht öffnen oder Task nicht Finden
  15. *               27=Einstellungen sind Leer
  16. *               28=kein Speicher für die Einstellungen
  17. *               29=kein MsgPort
  18. *               30=konnte kein IORequest create
  19. *               31=konnte Device nicht öffnen
  20. *               32=falsche Parameter angabe
  21. *               33=zu viele Gadget (>2560)
  22. *               34=konnte MonitorTreiber Datei nicht laden
  23. *               35=Monitor mit angebenen ID nicht gefunden
  24. *               36=konnte Screen nicht öffnen
  25. *               37=Fehler im Einstellungsfile
  26. *               38=Menu Fehler
  27. *               10=Return Code für die Startup-Sequence
  28.  
  29.     incdir  INCLUDE:
  30.     include exec/exec.i
  31.     include exec/io.i
  32.     include devices/input.i
  33.     include devices/inputevent.i
  34.     include dos/dos.i
  35.     include dos/dosextens.i
  36.     include dos/dostags.i
  37.     include intuition/intuition.i
  38.     include libraries/gadtools.i
  39.     include lvo/exec_lib.i
  40.     include lvo/dos_lib.i
  41.     include lvo/intuition_lib.i
  42.     include lvo/gadtools_lib.i
  43.     include lvo/graphics_lib.i
  44.     include lvo/input_lib.i
  45.  
  46.     STRUCTURE BangerMenu,0
  47.     APTR    BaM_MenuTitleText
  48.     APTR    BaM_MenuKey
  49.     STRUCT  BaM_SpaltenTitleText,[50*4]
  50.     STRUCT  BaM_SpaltenLaenge,[50]
  51.     STRUCT  BaM_GadgetLaenge,[50]
  52.     BYTE    BaM_SpaltenAnzahl
  53.     BYTE    BaM_SeitenAnzahl
  54.     WORD    BaM_GadgetAnzahl
  55.     LABEL   BaM_SIZEOF
  56.  
  57.     STRUCTURE Internal,0
  58.     APTR    INTUIBase               ;Intuition Lib. Addr.
  59.     APTR    DOSBase                 ;Dos Lib. Addr.
  60.     APTR    GADBase                 ;GadTools Lib. Addr.
  61.     APTR    GFXBase                 ;Graphics Lib. Addr.
  62.     APTR    WindowHandle            ;Fenster Addr.
  63.     APTR    ScreenHandle            ;ScreenAddr.
  64.     APTR    VisualInfo              ;VisualInfo Addr.
  65.     APTR    WinRPort                ;Window RasrPort Addr.
  66.     APTR    PrefsFileHandle         ;File Addr.
  67.     APTR    FileSpeicher            ;File Speicher
  68.     APTR    FontAddr                ;TextAttr-Struktur
  69.     APTR    meinTask                ;Task Addr.
  70.     APTR    alterTask               ;alter Task Addr.
  71.     APTR    AnGad                   ;Angewählte Gadget Addr.
  72.     APTR    MsgPortAddr             ;Addr. des Message Port
  73.     APTR    PrefsLoadKey            ;Para: PrefsFilename
  74.     APTR    MonitorKey              ;Para: MonitorTreiber
  75.     APTR    MoniID                  ;Para: MonitorID Nr.
  76.     APTR    NOKEYArray              ;Para: NOKEY
  77.     APTR    RDArgs                  ;Resultat von ReadArgs/dos
  78.     APTR    MenuPtr                 ;Menu Addr
  79.     APTR    PrintMarkTab            ;Text Marker für die Seiten beim erstellen
  80.     APTR    ProgrammDir             ;aktuelles Verzeichnis des Auszuführenden Prog.
  81.     APTR    AltesDir                ;altes Verzeichnis
  82.     STRUCT  FIB,[fib_SIZEOF]        ;FIB=FileInfoBlock Struktur
  83.     STRUCT  TastenIBlock,[IO_SIZE]  ;Addr. IORequest
  84.     STRUCT  MenuData,[BaM_SIZEOF*50] ;Daten des BangerMenu aufbau
  85.     STRUCT  PrintData,[it_SIZEOF*20] ;IntuiText Struktur für die Textausgabe der SpaltenTitle
  86.     STRUCT  VirtualMenu,[gnm_SIZEOF*55] ;unabhängiges ScreenMenu
  87.     STRUCT  GadgetAddr,[2600*4]     ;Alle GadgetsAddressen max 2600
  88.     STRUCT  GadgetListe,[11*4]      ;Einzelnen GadgetListe (Window)
  89.     STRUCT  PageLAddr,[11*4]        ;eine Seite zurück
  90.     STRUCT  PageRAddr,[11*4]        ;eine Seite vor
  91.     STRUCT  GadgetPage,[11*4]       ;Gadgetanfang einer Seite
  92.     STRUCT  PrintPage,[11*4]        ;PrintIText Addr
  93.     LONG    Filegroesse             ;Filegröße
  94.     WORD    HoeheWin                ;Fenster Höhe
  95.     WORD    BreiteWin               ;Fenster Breite
  96.     WORD    AlteHoeheWin            ;Alte Fenster Höhe
  97.     WORD    AlteBreiteWin           ;Alte Fenster Breite
  98.     WORD    SCHoehe                 ;Screen Höhe
  99.     WORD    SCBreite                ;Screen Breite
  100.     WORD    AnPage                  ;Momentaniges Angewählte Seite
  101.     WORD    MaxSpaltenZahl          ;Max. Anzahl in einer Spalte
  102.     WORD    JetztigeSeite           ;GadgetAnzahl der jetzigen Seite
  103.     WORD    VorigeSeitenLaenge      ;Vorige Seiten GadgetAnzahl
  104.     WORD    LetzteSPLaenge          ;Letzte Spalten Länge
  105.     WORD    ErsteSPLaenge           ;ErsteSpaltenLänge
  106.     WORD    VorigeSPLaenge          ;VorigeSpaltenLänge
  107.     WORD    JetztigeSPLaenge        ;JetzigeSpaltenLänge
  108.     WORD    NaechsteSPLaenge        ;NächsteSpaltenLänge
  109.     WORD    RelativeGDPos           ;GadgetPostion in der Spalte
  110.     BYTE    VorigeSPSeiten          ;keine Neue Seite bei voriger Spalte
  111.     BYTE    NaechsteSPSeiten        ;keine Neue Seite bei nächster Spalte
  112.     BYTE    TextUOFlag              ;Spalte-Text unter/ober Flag
  113.     BYTE    SpalteOhneTitle         ;Spalte Ohne Titel
  114.     BYTE    MenuEintragAnzahl       ;Anzahl der Menu Einträge im Screen-Menu
  115.     BYTE    ZweitePage              ;Zweite Seite Vorhanden
  116.     BYTE    ScreenSignal            ;SignalNr
  117.     BYTE    RelativeTopC            ;Relative Ecke von Oben
  118.     BYTE    RelativeLeftC           ;Relative Ecke von Links
  119.     BYTE    MenuAnGe                ;Momentaniges Angewähltes Menu
  120.     LABEL   Int_SIZEOF
  121. ;;
  122. ** Hauptprog
  123.     moveq   #0,d7            ;Error Code = 0
  124.     move.l  4.w,a6           ;EXECBase
  125.     move.l  #Int_SIZEOF,d0   ;Internal-Struktur
  126.     move.l  #MEMF_PUBLIC!MEMF_CLEAR,d1  ;Speicher Type: zuerst FAST MEM
  127.     jsr     _LVOAllocMem(a6) ;Speicher für Variablen reservieren
  128.     move.l  d0,a5            ;a5 Basis Addr. für alle Variablen
  129.     bne.s   LibraryO         ;Speicher OK!
  130.     moveq   #21,d7           ;21 = kein Speicher
  131.     bra.w   Ende             ;beenden
  132. LibraryO
  133.     bsr.w   InitRelative     ;Init Relative (kein Reloc Tabelle)
  134.     bsr.w   LibOeffne        ;Libraries öffnen
  135.     tst.w   d7               ;Fehler Code 0=OK
  136.     bne.w   SchliesseLibrary ;Error Beende
  137.     bsr.w   Parameter        ;Parameter abfragen
  138.     tst.w   d7               ;Parameter fehler
  139.     bne.s   SchliesseLibrary ;Schliesse Libraries
  140.     bsr.w   WaitOnCaps       ;CAPS-Lock Abfrage
  141.     cmp.w   #10,d7           ;Error wenn d7>10
  142.     bhi.s   ParameterFree    ;Ende wegen Error
  143.     tst.w   d7               ;d7=0
  144.     beq.s   Menuerscheine    ;BangerMenu Start
  145.     moveq   #0,d7            ;kein Fehler trotzdem Ende
  146.     bra.s   ParameterFree
  147. Menuerscheine
  148.     bsr.w   PubScreenOeffne  ;Öffne Screen
  149.     tst.w   d7               ;Fehler beim Screen Öffnen
  150.     bne.s   ParameterFree    ;gebe Parameter frei
  151.     bsr.w   LadePrefs        ;Lade Prefs
  152.     tst.w   d7               ;Fehler beim Laden des Prefs Files?
  153.     bne.s   SchliesseScreen  ;JA Schliesse Screen
  154.     bsr.w   WertePrefsAus    ;Prefs Auswerten
  155.     tst.w   d7               ;Prefs Fehler
  156.     bne.s   FreiSPrefs       ;Speicher Frei vom PrefsFile
  157.     bsr.b   InitMenu         ;Screen Menu Init
  158.     tst.b   d7               ;Fehler im Menu
  159.     bne.s   MenuRemove       ;Entferne Menu
  160.     bsr.w   InitGadget       ;Gadget Init
  161.     tst.w   d7               ;Fehler beim Gadget erschaffen ?
  162.     bne.s   MenuRemove       ;Entferne Menus
  163.     bsr.w   FensterOeffne    ;Fenster öffenen
  164.     tst.w   d7               ;Fehler beim Fenster Öffnen
  165.     bne.s   RemGad           ;Entferne Gadgets
  166.     bsr.w   SetAndLayout     ;Menu aufbau
  167.     tst.b   d7
  168.     bne.s   SchliesseFenster ;Schliesse Fenster
  169.     move.w  #0,d5            ;erstes Menu
  170.     bsr.w   PrintIUnter      ;Text Ausgabe
  171.     bsr.w   GadAktivieren    ;erstes Gadget aktivieren
  172.     bsr.w   RefreshWin       ;Fenster neuaufbau
  173.     bsr.w   MessageAbFragen  ;Fenster verwaltung
  174.     bsr.w   ClearMenu        ;Entferne Menu
  175. SchliesseFenster
  176.     bsr.w   FensterSchliesse ;Schliesse Fenster
  177. RemGad
  178.     bsr.w   RemoveGadget     ;Entferne Gadgets
  179. MenuRemove
  180.     bsr.w   RemoveMenu       ;Entferne Menu
  181. FreiSPrefs
  182.     bsr.w   SpeicherPrefs    ;Speicher vom Prefs File freigeben
  183. SchliesseScreen
  184.     bsr.w   ScreenSchliesse  ;Schliesse Screen
  185. ParameterFree
  186.     bsr.w   FreePara         ;Read Args wieder freigeben
  187. SchliesseLibrary
  188.     bsr.w   LibSchliesse     ;schliesse Libraries
  189.     move.l  a5,a1            ;Speicher Addr.
  190.     move.l  #Int_SIZEOF,d0   ;Größe
  191.     jsr     _LVOFreeMem(a6)  ;Speicher freigeben
  192. Ende
  193.     move.l  d7,d0            ;Error Code
  194. ende
  195.     rts                      ;Ende
  196. ;;
  197. ** InitMenu
  198. InitMenu
  199.     lea     UniGad(pc),a1           ;Universal NewGadget Struktur
  200.     move.b  RelativeTopC(a5),d4     ;Relative Ecke Oben
  201.     move.b  RelativeLeftC(a5),d5    ;Relative Ecke Links
  202.     add.b   d4,gng_TopEdge+1(a1)    ;Eintrag in die NewGadget Struktur
  203.     add.b   d5,gng_LeftEdge+1(a1)   ;Eintrag in die NewGadget Struktur
  204.     move.l  VisualInfo(a5),gng_VisualInfo(a1) ;VisualInfo eintrag
  205.     move.l  FontAddr(a5),gng_TextAttr(a1) ;TextAttr Struktur eintrag
  206.     lea     PageGads(pc),a1         ;Seiten umblätter Gadgets
  207.     add.b   d4,gng_TopEdge+1(a1)    ;Init
  208.     add.b   d5,gng_LeftEdge+1(a1)
  209.     move.l  VisualInfo(a5),gng_VisualInfo(a1)
  210.     move.l  FontAddr(a5),gng_TextAttr(a1)
  211.     lea     PageLeftTxt(pc),a2      ;TextString eintrag
  212.     move.l  a2,gng_GadgetText(a1)
  213.     lea     Page2Gads(pc),a1        ;Zweites Seiten umblätter Gadget
  214.     add.b   d4,gng_TopEdge+1(a1)
  215.     add.b   d5,gng_LeftEdge+1(a1)
  216.     move.l  VisualInfo(a5),gng_VisualInfo(a1)
  217.     move.l  FontAddr(a5),gng_TextAttr(a1)
  218.     lea     PageRightTxt(pc),a2
  219.     move.l  a2,gng_GadgetText(a1)
  220.     lea     VirtualMenu(a5),a0      ;unabhängiges Screen Menu
  221.     move.b  #NM_TITLE,gnm_Type(a0)  ;Titel
  222.     lea     ProjektName(pc),a1      ;Projekt String
  223.     move.l  a1,gnm_Label(a0)
  224.     lea     gnm_SIZEOF(a0),a0       ;Vorspringen
  225.     move.b  #NM_ITEM,gnm_Type(a0)   ;Über
  226.     lea     InfoName(pc),a1         ;Über String
  227.     move.l  a1,gnm_Label(a0)
  228.     lea     InfoTaste(pc),a1        ;Über Taste
  229.     move.l  a1,gnm_CommKey(a0)
  230.     lea     gnm_SIZEOF(a0),a0
  231.     move.b  #NM_ITEM,gnm_Type(a0)   ;Beenden
  232.     lea     QuitName(pc),a1         ;Beenden String
  233.     move.l  a1,gnm_Label(a0)
  234.     lea     QuitTaste(pc),a1        ;Beenden Taste
  235.     move.l  a1,gnm_CommKey(a0)
  236.     move.b  MenuEintragAnzahl(a5),d0 ;Screen Menu Anzahl
  237.     tst.b   d0
  238.     beq.s   keinGrossesMenu         ;gar kein UserMenu
  239.     lea     gnm_SIZEOF(a0),a0
  240.     move.b  #NM_TITLE,gnm_Type(a0)  ;BangerMenu
  241.     lea     WindowTitle(pc),a1      ;BangerMenu String
  242.     move.l  a1,gnm_Label(a0)
  243.     subq    #1,d0
  244.     lea     MenuData(a5),a1         ;BangerMenu Daten
  245. MenuInitLoop
  246.     lea     gnm_SIZEOF(a0),a0       ;Vorspringen zum nächsten Menu
  247.     move.b  #NM_ITEM,gnm_Type(a0)   ;Titel
  248.     move.l  BaM_MenuTitleText(a1),gnm_Label(a0) ;Titel String
  249.     move.l  BaM_MenuKey(a1),gnm_CommKey(a0) ;Menu Taste
  250.     lea     BaM_SIZEOF(a1),a1       ;BangerMenu Struktur vorspringen zum nächsten
  251.     dbra    d0,MenuInitLoop
  252. keinGrossesMenu
  253.     move.l  GADBase(a5),a6          ;GadTools Base
  254.     lea     VirtualMenu(a5),a0      ;NewMenu Struktur
  255.     lea     MenuTags(pc),a1         ;Menu TAGS
  256.     jsr     _LVOCreateMenusA(a6)    ;Menu Struktur erschaffen
  257.     move.l  d0,MenuPtr(a5)          ;Menu Addr.
  258.     beq.s   MenuError               ;Fehler ?
  259.     move.l  d0,a0
  260.     move.l  VisualInfo(a5),a1       ;VisualInfo Addr.
  261.     suba.l  a2,a2                   ;keine TAGS
  262.     jsr     _LVOLayoutMenusA(a6)    ;Menu Aufbauen
  263.     move.l  d0,d1                   ;alles geklappt
  264.     bne.s   MenuOK                  ;JA
  265. MenuError
  266.     moveq   #38,d7                  ;38=Menu Fehler
  267. MenuOK
  268.     rts
  269. RemoveMenu
  270.     move.l  GADBase(a5),a6          ;GadTools Base
  271.     move.l  MenuPtr(a5),a0          ;Menu Addr.
  272.     jsr     _LVOFreeMenus(a6)       ;Gebe Speicher der Menu Struktur frei
  273.     rts
  274. ;;
  275. ** SetAndLayout ClearMenu PrintIUnter
  276. SetAndLayout
  277.     move.l  INTUIBase(a5),a6        ;Intuition Base
  278.     move.l  WindowHandle(a5),a0     ;Fenster Addr.
  279.     move.l  MenuPtr(a5),a1          ;Menu Addr.
  280.     jsr     _LVOSetMenuStrip(a6)    ;Setze Menu
  281.     move.l  d0,d1                   ;Fehler ?
  282.     bne.s   SetLayOK                ;NEIN
  283.     moveq   #38,d7                  ;Menu Fehler
  284. SetLayOK
  285.     rts
  286. ClearMenu
  287.     move.l  INTUIBase(a5),a6        ;Intuition Base
  288.     move.l  WindowHandle(a5),a0     ;Fenster Addr.
  289.     jsr     _LVOClearMenuStrip(a6)  ;Entferne Menu
  290.     rts
  291. PrintIUnter
  292.     lea     PrintPage(a5),a1        ;PrintIText Addr
  293.     lea     (a1,d5.w),a1            ;welches Menu
  294.     move.l  (a1),a1
  295.     lea     it_SIZEOF(a1),a1
  296.     move.l  WinRPort(a5),a0         ;Fenster RastPort Addr.
  297.     moveq   #0,d0
  298.     moveq   #0,d1
  299.     move.b  RelativeTopC(a5),d1     ;Relative
  300.     move.b  RelativeLeftC(a5),d0
  301.     move.l  INTUIBase(a5),a6        ;Intuition Base
  302.     jsr     _LVOPrintIText(a6)      ;Schreibe Text
  303.     rts
  304. ;;
  305. ** WertePrefsAus
  306. WertePrefsAus
  307.     move.w  SCHoehe(a5),d0          ;Screen Höhe
  308.     sub.w   #20,d0                  ;Höhe-20
  309.     moveq   #10,d1
  310.     divu.w  d1,d0                   ;Höhe/10
  311.     move.w  d0,MaxSpaltenZahl(a5)   ;Max. Anzahl in einer Spalte
  312.     move.l  FileSpeicher(a5),a1     ;PrefsFile anfang
  313.     move.l  Filegroesse(a5),d0      ;PrefsFile größe
  314.     move.l  a1,a2                   ;PrefsFile -->a2
  315.     add.l   d0,a2                   ;PrefsFile Ende
  316. MenuDochNoch
  317.     cmp.l   #'MENU',(a1)            ;MENU vorhanden
  318.     beq.s   MenuEintrag             ;JA!
  319. keinMenuReturn
  320.     cmp.b   #10,(a1)+               ;Suche Return
  321.     bne.s   keinMenuReturn
  322.     cmp.l   a1,a2                   ;PrefsFile schon Ende
  323.     bgt.s   MenuDochNoch            ;NEIN dann nach MENU suchen
  324.     lea     MenuData(a5),a3         ;BangerMenu Struktur
  325.     move.l  FileSpeicher(a5),a1     ;PrefsFile
  326.     bra.w   UnterMenuGefunden
  327. MenuEintrag
  328.     lea     MenuData(a5),a3         ;BangerMenu Struktur
  329.     moveq   #0,d0
  330. EintragMenuSLoop
  331.     cmp.b   #10,(a1)+               ;Suche Return
  332.     bne.s   EintragMenuSLoop
  333. EintragMenu2Loop
  334.     move.b  #0,-1(a1)               ;NULL Byte als Terminierung
  335.     cmp.l   #'ENDM',(a1)            ;Vergleiche ENDM
  336.     beq.s   AlleMenuEintrage        ;JA alle Menu einträge gefunden
  337.     cmp.l   a1,a2                   ;Schon Ende
  338.     bls.w   PrefsWerteError         ;JA dann Fehler in den Prefs
  339.     lea     1(a1),a1                ;ein Leerzeichen bevor Menuname Anfängt
  340.     move.l  a1,(a3)                 ;MenuName in BangerMenu Struktur eintragen
  341. weiterSuchenMKey
  342.     move.b  (a1)+,d1
  343.     cmp.l   #'MKEY',(a1)            ;vergleiche MKEY vorhanden
  344.     beq.s   TasteFuerMenu           ;JA Menu hat eine Taste
  345.     cmp.b   #10,d1                  ;Menuname Ende ?
  346.     bne.s   weiterSuchenMKey        ;Nein
  347. MKeyGefunden    
  348.     lea     BaM_SIZEOF(a3),a3       ;nächste Struktur für ein neues Menu
  349.     addq    #1,d0                   ;Zähle Menus
  350.     cmp.b   #50,d0                  ;schon 50 ?
  351.     beq.s   AlleMenuEintrage        ;JA dann abschliessen
  352.     bra.s   EintragMenu2Loop        ;Ansonsten nächstes Menu extrahieren
  353. TasteFuerMenu
  354.     move.b  #0,-1(a1)               ;MeunName NULL Byte Termieren
  355.     lea     5(a1),a1                ;Vorspringen zum Zeichen
  356.     move.l  a1,BaM_MenuKey(a3)      ;Zeichen eintragen in BangerMenu
  357. EintragMenu3Loop    
  358.     cmp.b   #10,(a1)+               ;Return ?
  359.     bne.s   EintragMenu3Loop        ;NEIN
  360.     bra.s   MKeyGefunden            ;JA und zurück
  361. AlleMenuEintrage
  362.     move.b  d0,MenuEintragAnzahl(a5) ;Anzahl der Menu Einträge im Screen-Menu
  363.     lea     MenuData(a5),a3          ;BangerMenu Struktur
  364. NaechstesUnterM 
  365.     move.l  BaM_MenuTitleText(a3),a0 ;MenuTitel
  366.     move.l  FileSpeicher(a5),a1     ;PrefsFile Anfang
  367.     move.b  (a0),d0                 ;Erstes Zeichen vom MenuTitel --> d0
  368. TestUnterMenuLoop
  369.     cmp.b   (a1),d0                 ;Vergleiche PrefsFile mit d0
  370.     beq.s   MenuBezeich             ;gleich
  371. keinMenuBezReturn
  372.     cmp.b   #10,(a1)+               ;Suche Return
  373.     bne.s   keinMenuBezReturn
  374.     cmp.l   a1,a2                   ;PrefsEnde
  375.     bgt.s   TestUnterMenuLoop       ;nächste Zeile im PrefsFile
  376.     bra.w   PrefsWerteError         ;Menu Eintrag Leer
  377. MenuBezeich
  378.     move.l  a0,a4                   ;MenuTitel
  379. MenuBezeichLoop
  380.     move.b  (a0)+,d1                ;Buchstabe --> d1
  381.     tst.b   d1                      ;MenuTitle Ende ?
  382.     beq.s   UnterErstGefunden       ;JA --> MenuDaten gefunden
  383.     cmp.b   (a1)+,d1                ;Vergleiche Prefs mit MenuTitel
  384.     beq.s   MenuBezeichLoop         ;Noch gleich
  385.     move.l  a4,a0                   ;Zurück setzen des MenuTitels
  386.     bra.s   keinMenuBezReturn       ;und weiter suchen
  387. UnterErstGefunden   
  388.     move.b  #0,(a1)+          ;Prefs MenuTitel Null Terimiert
  389. UnterMenuGefunden
  390.     moveq   #0,d5
  391.     moveq   #0,d4             ;d4=SpaltenAnzahl
  392. UnterMenu2Loop
  393.     moveq   #0,d0             ;Anzahl der Gadgets
  394.     moveq   #0,d2             ;Längste Gadget
  395.     moveq   #0,d3             ;0/1
  396. UnterMenuLoop
  397.     moveq   #0,d1             ;Aktuell Gadgetlänge
  398.     cmp.l   a1,a2             ;PrefsEnde ?
  399.     beq.w   Unter2MenuFertig   ;JA Daten für Menu fertig
  400.     cmp.l   #'END ',(a1)      ;END vorhanden
  401.     beq.w   UnterMenuFertig   ;JA Daten für Menu fertig
  402.     cmp.l   #'COLT',(a1)      ;COLT vorhanden
  403.     beq.s   SpaltenTitle      ;Neu Spalte
  404.     lea     1(a1),a1          ;Ein Vorrücken da ein Space vor den Daten liegt
  405.     cmp.l   a1,a2             ;PrefsEnde ?
  406.     beq.w   Unter2MenuFertig   ;JA Daten für Menu fertig
  407. keinReturn
  408.     addq    #1,d1             ;länge GadgetName aus der Prefs
  409.     cmp.b   #10,(a1)+         ;Return suchen
  410.     bne.s   keinReturn
  411.     move.b  #0,-1(a1)         ;das Return ersetzen mit NullByte
  412.     tst.b   d3                ;d3 0/1 entweder Gadgetname oder Programm bzw. Batchdatei
  413.     beq.s   BreiteZaehlen     ;GadgetName
  414.     moveq   #0,d3             ;nächste Zeile ist wieder ein Gadgetname
  415.     bra.s   UnterMenuLoop     ;nächste Zeile bearbeiten
  416. BreiteZaehlen
  417.     moveq   #1,d3             ;nächste Zeile ist Programm bzw. Batchdatei
  418.     addq    #1,d0             ;d0=Anzahl der Gadgets
  419.     cmp.b   d2,d1             ;d2 enthält den längsten Gadgetnamen
  420.     bls.s   UnterMenuLoop     ;nächste Zeile bearbeiten
  421.     move.b  d1,d2             ;neue länge war größer als alte
  422.     bra.s   UnterMenuLoop     ;nächste Zeile bearbeiten
  423. SpaltenTitle
  424.     cmp.b   #50,d4            ;SpaltenAnzahl=50 ?
  425.     beq.w   MenuIstVoll       ;JA keine Spalte mehr
  426.     lea     9(a1),a1          ;Vorsprung zum SpaltenTitle
  427.     tst.b   d4                ;erste Spalte ?
  428.     beq.s   keineBaMDaten     ;JA
  429.     bsr.s   Spalteninit       ;Spalten Daten eintragen
  430.     tst.l   d7                ;Gadget über dem Max. Check
  431.     bne.s   MenuGadgetzuviel  ;JA zu viele
  432.     bra.s   BaMDatenDA
  433. keineBaMDaten
  434.     lea     BaM_SpaltenTitleText(a3),a0 ;SpaltenTitel eintrag in BangerMenu Struktur
  435. BaMDatenDA  
  436.     move.l  a1,(a0)                     ;PrefsSpaltenTitel
  437. SpaltenTitleLoop
  438.     cmp.b   #10,(a1)+                   ;Suche Return
  439.     bne.s   SpaltenTitleLoop
  440.     move.b  #0,-1(a1)                   ;Mit NULL Byte Terimieren
  441.     addq    #1,d4                       ;SpaltenAnzahl erhöhen
  442.     bra.s   UnterMenu2Loop              ;Nächste Zeile
  443. MenuGadgetzuviel
  444.     sub.w   d0,d5                       ;Wieder alte Gadgets Anzahl herstellen
  445.     moveq   #0,d7                       ;d7 korrigieren
  446.     bra.w   MenuIstVoll                 ;diese Menu zu voll
  447. Spalteninit
  448.     moveq   #-1,d7                      ;Error wenn Gadget zu viel sind
  449.     add.w   d0,d5                       ;GadgetAnzahl der vorigen Spalte addieren
  450.     cmp.w   #2560,d5                    ;gesamt Gadgets Anzahl über 2560 ?
  451.     bge.s   keineSpaltemehrMoeg         ;JA - dann keine weiteren Gadgets mehr
  452.     move.w  d4,d6                       ;SpaltenAnzahl --> d6
  453.     subq    #1,d6                       ;SpaltenAnzahl-1
  454.     lea     BaM_GadgetLaenge(a3),a6     ;Längste Gadget in der Spalte
  455.     lea     (a6,d6.w),a6
  456.     lea     BaM_SpaltenLaenge(a3),a4    ;Spalten Länge
  457.     lea     (a4,d6.w),a4
  458.     add.w   d6,d6                       ;SpaltenAnzahl*4, weil long
  459.     add.w   d6,d6
  460.     lea     BaM_SpaltenTitleText(a3),a0 ;auf Aktuellen SpaltenTitle setzen
  461.     lea     (a0,d6.w),a0
  462.     move.l  (a0),d7                     ;SpaltenTitel Addr. d7
  463. SpaltenCheck
  464.     cmp.w   MaxSpaltenZahl(a5),d0       ;Max. Anzahl an Gadget pro Spalte
  465.     bls.s   nurnocheineSpalte           ;weniger noch ein Spalte
  466.     sub.w   MaxSpaltenZahl(a5),d0       ;Max. Anzahl an Gadget pro Spalte abziehen von Anzahl der Gadgets
  467.     move.b  MaxSpaltenZahl+1(a5),(a4)+  ;Spaltenlänge = max.
  468.     move.b  d2,(a6)+                    ;Längsten GadgetNamen
  469.     move.l  d7,(a0)+                    ;Spalte besitzt den gleichen SpaltenTitel
  470.     tst.b   SpalteOhneTitle(a5)         ;Spalte Ohne Titel?
  471.     bne.s   NaechstenSPTitleKoor         ;JA
  472. SPTitleKorrFertig
  473.     addq    #1,d4                       ;Spalten Anzahl erhöhen
  474.     cmp.b   #50,d4                      ;50 Spalten erreicht ?
  475.     beq.s   keineSpaltemehrMoeg         ;JA genug Spalten
  476.     bra.s   SpaltenCheck                ;Ansonsten weitere Erzeugen
  477. NaechstenSPTitleKoor
  478.     move.l  d7,a1                       ;a1=Gadgetname aus Konfig
  479.     move.w  MaxSpaltenZahl(a5),d1       ;d1=Max. Anzahl an Gadgets/Spalte
  480.     add.w   d1,d1                       ;*2 weil GadgetName + ProgrammName
  481. SPTitle1Korr
  482.     tst.b   (a1)+                       ;NULL Byte suche
  483.     bne.s   SPTitle1Korr
  484.     subq    #1,d1                       ;Schon alle Gadgets
  485.     bne.s   SPTitle1Korr                ;Nein
  486.     move.l  a1,d7                       ;d7=Addr. der Gadget der nächsten Spalte
  487.     bra.s   SPTitleKorrFertig
  488. nurnocheineSpalte
  489.     move.b  d0,(a4)                     ;Spaltenlänge
  490.     move.b  d2,(a6)                     ;Längsten GadgetNamen
  491.     move.l  d7,(a0)+                    ;Spalte besitzt den gleichen SpaltenTitel
  492.     moveq   #0,d7                       ;d7 wieder löschen
  493. keineSpaltemehrMoeg
  494.     rts
  495. Unter2MenuFertig
  496.     move.l  FileSpeicher(a5),a1         ;PrefsFile anfang
  497.     moveq   #1,d4                       ;Eine Spalte
  498.     bra.s   AltePrefsOhneSpalten
  499. UnterMenuFertig
  500.     tst.b   d4                          ;Spalten ?
  501.     bne.s   JauEinSpalt                 ;JA
  502.     addq    #1,d4                       ;Spalten Anzahl +1
  503.     tst.b   d0                          ;keine Gadgets ?
  504.     beq.s   JauEinSpalt                 ;JA
  505.     move.w  d0,d1                       ;Gadgets Anzahl --> d1
  506.     add.w   d1,d1                       ;d1*2 (GadgetNamen + Programm/Batch)
  507.     addq    #1,d1                       ;d1+1
  508. EndeVonMenu
  509.     tst.b   -(a1)                       ;Suche NULL Byte (Ende einer Zeile)
  510.     bne.s   EndeVonMenu
  511.     subq    #1,d1                       ;Gefunden d1-1
  512.     bne.s   EndeVonMenu
  513. EinVorRueck
  514.     lea     1(a1),a1                    ;Nächste Zeile
  515.     cmp.b   #' ',(a1)                   ;Leerzeichen
  516.     beq.s   EinVorRueck                 ;JA
  517. AltePrefsOhneSpalten
  518.     lea     BaM_SpaltenTitleText(a3),a0 ;SpaltenTitel --> in diesem Fall nicht
  519.     move.l  a1,(a0)                     ;darum wird das SpalteOhneTitle Flag gesetzt
  520.     move.b  #-1,SpalteOhneTitle(a5)     ;Spalte Ohne Titel
  521. JauEinSpalt 
  522.     bsr.w   Spalteninit                 ;Spalten Daten init
  523.     tst.b   d7                          ;Zu viele Gadgets
  524.     bne.w   MenuGadgetzuviel            ;Gadgets Anzahl wieder herstellen
  525.     tst.b   SpalteOhneTitle(a5)         ;Spalte Ohne Titel
  526.     beq.s   MenuIstVoll                 ;NEIN
  527.     neg.b   d4                          ;SpaltenAnzahl wieder korrigieren
  528.     move.b  #0,SpalteOhneTitle(a5)      ;Flag zurück setzen für nächstes Menu
  529. MenuIstVoll
  530.     lea     BaM_SpaltenAnzahl(a3),a4    ;Spalten Anzahl eintragen
  531.     move.b  d4,(a4)
  532.     lea     BaM_GadgetAnzahl(a3),a4     ;Gadgets Anzahl Insgesamt pro Menu eintragen
  533.     move.w  d5,(a4)
  534.     lea     BaM_SIZEOF(a3),a3           ;Nächstes Menu
  535.     tst.l   (a3)                        ;vorhanden ?
  536.     bne.w   NaechstesUnterM             ;JA
  537.     rts
  538. PrefsWerteError
  539.     moveq   #37,d7                      ;37=Fehler im Einstellungsfile
  540.     rts
  541. ;;
  542. ** Parameter
  543. Parameter
  544.     move.l  DOSBase(a5),a6      ;DOS Befehle
  545.     lea     ParaTemplate(pc),a1 ;Parameter String
  546.     move.l  a1,d1
  547.     lea     PrefsLoadKey(a5),a1 ;Speicher für die 4 Parameter
  548.     move.l  a1,d2
  549.     moveq   #0,d3               ;rdargs keine
  550.     jsr     _LVOReadArgs(a6)    ;Parameter einlesen und parsen
  551.     move.l  d0,RDArgs(a5)       ;Resultat nach RDArgs
  552.     bne.s   ParaOK              ;Parameter OK!
  553.     jsr     _LVOIoErr(a6)       ;Error Routine
  554.     move.l  d0,d1               ;Error Nr.
  555.     moveq   #0,d2               ;keine Überschrift
  556.     jsr     _LVOPrintFault(a6)  ;FehlerAusgabe im Con-Fenster
  557.     moveq   #32,d7              ;32=falsche Parameter angabe
  558. ParaOK
  559.     rts
  560. FreePara
  561.     move.l  RDArgs(a5),d1       ;ReadArgs Resultat
  562.     move.l  DOSBase(a5),a6      ;wieder Freigeben
  563.     jsr     _LVOFreeArgs(a6)
  564.     rts
  565. ;;
  566. ** Warte auf Caps Lock
  567. WaitOnCaps
  568.     tst.l   NOKEYArray(a5)          ;kein CAPS-Lock
  569.     bne.s   NOKeyJA                 ;ja weiter
  570.     move.l  4.w,a6                  ;EXECBase
  571.     jsr     _LVOCreateMsgPort(a6)   ;Neuen Message Port init
  572.     move.l  d0,MsgPortAddr(a5)      ;Addr. des Message Port
  573.     bne.s   MsgPortOK               ;Message Port vorhanden
  574.     moveq   #29,d7                  ;29=kein MsgPort
  575.     rts
  576. MsgPortOK
  577.     move.l  d0,a0
  578.     move.l  #IOSTD_SIZE,d0          ;normale IORequest-Struktur
  579.     jsr     _LVOCreateIORequest(a6) ;Init IORequest
  580.     move.l  d0,TastenIBlock(a5)     ;Addr. IORequest
  581.     bne.s   OeffneDev               ;kein Fehler
  582.     moveq   #30,d7                  ;30=konnte kein IORequest init
  583.     bra.s   FreiMsgP
  584. OeffneDev
  585.     lea     inputname(pc),a0        ;input.device
  586.     move.l  d0,a1                   ;IORequest Addr.
  587.     moveq   #0,d0                   ;Unit 0
  588.     move.l  #IOF_QUICK,d1           ;Flags
  589.     jsr     _LVOOpenDevice(a6)      ;Öffnen des Input.device
  590.     tst.l   d0                      ;Fehler ?
  591.     beq.s   DevOK                   ;Nein
  592.     moveq   #31,d7                  ;31=konnte Device nicht öffnen
  593.     bra.s   IOReqDel
  594. DevOK
  595.     move.l  TastenIBlock(a5),a0     ;IORequest Struktur
  596.     move.l  IO_DEVICE(a0),a6        ;Device Node name
  597.     jsr     _LVOPeekQualifier(a6)   ;Tastaturstatus
  598.     move.w  d0,d1                   ;d1=InputEvent-Struktur
  599.     and.w   #IEQUALIFIER_LEFTBUTTON,d1 ;Bit Maske für Linken Mouse Knopf
  600.     cmp.w   #IEQUALIFIER_LEFTBUTTON,d1 ;gleich Linke Mouse Knopf
  601.     beq.s   CAPSgedrueckt
  602.     and.w   #IEQUALIFIER_CAPSLOCK,d0 ;Bit Maske für CAPSLock
  603.     cmp.w   #IEQUALIFIER_CAPSLOCK,d0 ;CAPSLock gedrückt
  604.     beq.s   CAPSgedrueckt            ;JA
  605.     moveq   #10,d7                  ;Beenden
  606. CAPSgedrueckt
  607.     move.l  4.w,a6                  ;EXECBase
  608.     lea     TastenIBlock(a5),a1     ;IORequest
  609.     jsr     _LVOCloseDevice(a6)     ;SchliesseDevice
  610. IOReqDel
  611.     move.l  TastenIBlock(a5),a0     ;IORequest
  612.     jsr     _LVODeleteIORequest(a6) ;Gib Speicher Frei
  613. FreiMsgP
  614.     move.l  MsgPortAddr(a5),a0      ;Message Struktur
  615.     jsr     _LVODeleteMsgPort(a6)   ;Gib Message Struktur frei
  616. NOKeyJA
  617.     rts
  618. ;;
  619. ** GadAktivieren
  620. GadAktivieren
  621.     move.l  GadgetAddr(a5),a3   ;GadgetList Addr
  622.     lea     GadgetPage(a5),a4   ;Gadget Anfang einer Seite
  623.     lea     (a4,d5.w),a4        ;welches Menu
  624.     move.l  (a4),a4
  625.     move.l  (a4),a4
  626.     moveq   #1,d6               ;Aktiviere
  627.     bsr.w   SelGK               ;Setze Gadget
  628.     lea     GadgetPage(a5),a4   ;Gadget Anfang einer Seite
  629.     lea     (a4,d5.w),a4
  630.     move.l  (a4),a4
  631.     move.l  a4,AnGad(a5)        ;Angewählte Gadget Addr.
  632.     rts
  633. ;;
  634. ** InitRelative
  635. InitRelative
  636.     lea     topazFName8(pc),a0      ;FontName Addr.
  637.     lea     topaz8(pc),a1           ;TextAttr-Struktur
  638.     move.l  a0,(a1)                 ;Init Addr. in der Struktur
  639.     move.l  a1,FontAddr(a5)         ;Varibale für TextAttr-Struktur
  640.     rts
  641. ;;
  642. ** MessageAbFragen  MsgVerarbeitung Sprung
  643. MessageAbFragen
  644.     move.l  WindowHandle(a5),a0    ;a0=FensterAddr.
  645.     move.l  wd_UserPort(a0),a0     ;a0=Fenster UserPort
  646.     move.l  4.w,a6                 ;a6=EXECBase
  647.     jsr     _LVOWaitPort(a6)       ;Auf Nachricht warten für das Fenster
  648. nocheine
  649.     move.l  GADBase(a5),a6         ;a6=GadTools Base
  650.     move.l  WindowHandle(a5),a0    ;a0=FensterAddr.
  651.     move.l  wd_UserPort(a0),a0     ;a0=Fenster UserPort
  652.     jsr     _LVOGT_GetIMsg(a6)     ;Hole Nachricht
  653.     move.l  d0,a1                  ;a1=Nachricht
  654.     tst.l   d0                     ;keine Nachricht mehr da?
  655.     beq.s   MessageAbFragen        ;JA
  656.     move.w  im_Qualifier(a1),d2    ;d2=Qualifier Tasten
  657.     move.l  im_Class(a1),d3        ;d3=Nachrichten Klasse
  658.     move.w  im_Code(a1),d4         ;d4=Nachrichten Code
  659.     move.l  im_IAddress(a1),a4     ;a4=Addresse
  660.     jsr     _LVOGT_ReplyIMsg(a6)   ;Antwort
  661.     cmpi.l  #IDCMP_CLOSEWINDOW,d3  ;Fenster schliessen
  662.     beq.w   ende                   ;dann ende
  663.     cmpi.l  #IDCMP_REFRESHWINDOW,d3 ;Fenster neu zeichen
  664.     beq.w   RefreWin
  665.     cmpi.l  #IDCMP_GADGETUP,d3     ;Gadget losgelassen
  666.     beq.w   GadAuswertung
  667.     cmpi.l  #IDCMP_VANILLAKEY,d3   ;normaler Tasten druck
  668.     beq.w   VanTaste
  669.     cmpi.l  #IDCMP_RAWKEY,d3       ;Spezial Tasten
  670.     beq.w   RAWTaste
  671.     cmp.l   #IDCMP_MENUPICK,d3     ;Menu
  672.     beq.s   MenuAuswertung
  673.     bra.s   nocheine
  674. ** MenuAuswertung
  675. MenuAuswertung
  676.     cmpi.w  #MENUNULL,d4           ;kein Menu aus gewählt
  677.     beq.b   nocheine
  678.     cmp.w   #$F800,d4              ;Über
  679.     beq.w   About
  680.     cmp.w   #$F820,d4              ;Beeenden
  681.     beq.w   ende
  682.     moveq   #0,d6
  683.     sub.w   #$F801,d4              ;d4=vielfaches von 20
  684. MenuErmittelLoop
  685.     tst.w   d4                     ;d4=0?
  686.     beq.s   MenuWeiterWert         ;JA
  687.     sub.w   #$20,d4                ;d4-20
  688.     addq    #1,d6                  ;d6=Menuzähler
  689.     bra.s   MenuErmittelLoop
  690. MenuWeiterWert
  691.     cmp.b   MenuAnGe(a5),d6        ;Angewähltes Menu=d6
  692.     beq.w   nocheine               ;JA
  693.     bsr.w   ReGadList              ;Entferne Gadget Liste
  694.     bsr.w   RemoveGadget           ;gebe Gadget speicher frei
  695.     move.b  d6,MenuAnGe(a5)        ;neues Angewähltes Menu
  696.     move.w  HoeheWin(a5),AlteHoeheWin(a5) ;Alte Fenster Höhe
  697.     move.w  BreiteWin(a5),AlteBreiteWin(a5) ;Alte Fenster Breite
  698.     bsr.w   InitGadget             ;Gadget erschaffen
  699.     tst.b   d7                     ;Fehler
  700.     beq.s   NeuMenuGadgetOK        ;Nein
  701.     rts
  702. NeuMenuGadgetOK 
  703.     moveq   #0,d5
  704.     move.w  d5,AnPage(a5)         ;erste Seite ist angewählt
  705.     move.w  AlteHoeheWin(a5),d0   ;d0=alte Fenter Höhe
  706.     cmp.w   HoeheWin(a5),d0       ;vergleiche mit jetziger Fenster Höhe
  707.     bls.s   VergroesserWin        ;Verändere Fenster
  708.     move.w  AlteBreiteWin(a5),d0  ;d0=alte Fenter Breite
  709.     cmp.w   BreiteWin(a5),d0      ;vergleiche mit jetziger Fenster Breite
  710.     bgt.s   keinVergroessern      ;Fenster nicht verändern
  711. VergroesserWin
  712.     move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
  713.     move.w  BreiteWin(a5),d0      ;d0=FensterBreite
  714.     sub.w   AlteBreiteWin(a5),d0  ;d0-alte FensterBreite
  715.     lsr.w   #1,d0                 ;d0/2
  716.     neg.w   d0                    ;-d0
  717.     move.w  HoeheWin(a5),d1       ;d1=FensterHöhe
  718.     sub.w   AlteHoeheWin(a5),d1   ;d1-alte FensterHöhe
  719.     lsr.w   #1,d1                 ;d1/2
  720.     neg.w   d1                    ;-d1
  721.     move.l  INTUIBase(a5),a6      ;a6=Intuition Base
  722.     jsr     _LVOMoveWindow(a6)    ;Verschiebe Fenster
  723.     move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
  724.     move.w  BreiteWin(a5),d0      ;d0=FensterBreite
  725.     sub.w   AlteBreiteWin(a5),d0  ;d0-alte FensterBreite
  726.     move.w  HoeheWin(a5),d1       ;d1=FensterHöhe
  727.     sub.w   AlteHoeheWin(a5),d1   ;d1-alte FensterHöhe
  728.     jsr     _LVOSizeWindow(a6)    ;Vergrößere Fenster
  729. keinVergroessern
  730.     bsr.w   AddGadList            ;GadgetListe anfügen
  731.     bsr.w   PrintIUnter           ;Text Ausgeben
  732.     bsr.w   GadAktivieren         ;erstes Gadget aktivieren
  733.     bra.w   nocheine
  734. ;;
  735. ** About
  736. About
  737.     move.l  WindowHandle(a5),a0     ;a0=Fenster Addr.
  738.     lea     AbReqTi(pc),a2          ;a2=RequesterTitel
  739.     lea     AbReqTxt(pc),a3         ;a3=RequesterText
  740.     lea     AbGadTxt(pc),a4         ;a4=RequesterGadgetText
  741.     lea     EndeReq(pc),a1          ;a1=EasyRequesterStruktur
  742.     move.l  a2,8(a1)
  743.     move.l  a3,12(a1)
  744.     move.l  a4,16(a1)
  745.     suba.l  a2,a2
  746.     suba.l  a3,a3
  747.     move.l  INTUIBase(a5),a6        ;a6=Intuition Base
  748.     jsr     _LVOEasyRequestArgs(a6) ;Requester aufrufen
  749.     bra.w   nocheine
  750. ;;
  751. ** RefreWin
  752. RefreWin
  753.     bsr.w   RefreshWin ;Fenster Neuzeichen
  754.     bra.w   nocheine
  755. ;;
  756. ** RAWTaste
  757. RAWTaste
  758.     move.b  d2,d1
  759.     and.b   #IEQUALIFIER_CONTROL,d1
  760.     bne.s   CtrlTaste
  761.     and.b   #IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT,d2
  762.     bne.s   ShiftTaste
  763.     cmp.b   #$4e,d4         ;rechts
  764.     beq.w   rechteBank
  765.     cmp.b   #$4f,d4         ;links
  766.     beq.w   linkeBank
  767.     cmp.b   #$4d,d4         ;Down
  768.     beq.w   DownTaste
  769.     cmp.b   #$4c,d4         ;Up
  770.     beq.w   UpTaste
  771.     bra.w   nocheine
  772. VanTaste
  773.     cmp.b   #$0d,d4         ;Return
  774.     beq.s   Auswahl
  775.     cmp.b   #$1b,d4         ;Esc
  776.     beq.w   ende
  777.     cmp.b   #'<',d4         ;vorige Seite
  778.     beq.s   PfeilLinks
  779.     cmp.b   #'>',d4         ;nächste Seite
  780.     beq.s   PfeilRechts
  781.     bclr    #5,d4           ;bit 5 löschen Groß und Kleinschreibung gleich
  782.     cmp.b   #'Q',d4         ;q/Q
  783.     beq.w   ende
  784.     bra.w   nocheine
  785. ShiftTaste
  786.     cmp.b   #$4e,d4         ;rechts+shift
  787.     beq.w   rechtsShift
  788.     cmp.b   #$4f,d4         ;links+shift
  789.     beq.w   linkeShift
  790.     cmp.b   #$4d,d4         ;Down+shift
  791.     beq.w   DownShift
  792.     cmp.b   #$4c,d4         ;Up+shift
  793.     beq.w   UpShift
  794.     bra.w   nocheine
  795. CtrlTaste
  796.     cmp.b   #$4e,d4         ;rechts+shift
  797.     beq.w   rechtsCtrl
  798.     cmp.b   #$4f,d4         ;links+shift
  799.     beq.w   linkeCtrl
  800.     bra.w   nocheine
  801. Auswahl
  802.     move.l  AnGad(a5),a4    ;a4=Angewählte GadgetAddr.
  803.     move.l  (a4),a4
  804.     bra.s   GadExe
  805. PfeilLinks
  806.     tst.w   AnPage(a5)      ;erste Seite
  807.     beq.w   nocheine        ;JA
  808.     bra.w   PageLGAn
  809. PfeilRechts
  810.     bsr.s   MenuDataInit    ;Daten zur jetzigen Seite heraussuchen
  811.     moveq   #0,d0
  812.     move.b  BaM_SeitenAnzahl(a4),d0 ;d0=Seiten Anzahl
  813.     cmp.w   AnPage(a5),d0   ;vergleiche mit angewählter Seite
  814.     beq.w   nocheine        ;letzte Seite
  815.     bra.w   PageRGAn
  816. MenuDataInit
  817.     lea     MenuData(a5),a4 ;BangerMenu Struktur
  818.     moveq   #0,d0
  819.     moveq   #0,d1
  820.     move.b  MenuAnGe(a5),d0 ;Angewähltes Menu
  821.     move.w  #BaM_SIZEOF,d1  ;BangerMenu Struktur Größe
  822.     mulu.w  d0,d1
  823.     lea     (a4,d1.w),a4    ;BangerMenuData
  824.     rts
  825. ;;
  826. ;;
  827. ** GadAuswertung
  828. GadAuswertung
  829.     lea     PageLAddr(a5),a0    ;a0=GadgetAddr. vorige Seiten Gadget
  830.     move.w  AnPage(a5),d5       ;d5=Angewählte Seite
  831.     lea     (a0,d5.w),a0
  832.     move.l  (a0),a0
  833.     cmp.l   a0,a4               ;vergleiche mit Addresse
  834.     beq.w   PageLGAn            ;vorige Seite gewählt
  835.     lea     PageRAddr(a5),a0    ;a0=GadgetAddr. nächste Seiten Gadget
  836.     lea     (a0,d5.w),a0
  837.     move.l  (a0),a0
  838.     cmp.l   a0,a4               ;vergleiche mit Addresse
  839.     beq.w   PageRGAn            ;nächste Seite gewählt
  840. GadExe
  841.     move.l  gg_UserData(a4),a1  ;a1=Addr. des GadgetNamen aus der Konfig
  842. SucheAnfangExe
  843.     tst.b   (a1)+               ;Suche Null Bye
  844.     bne.s   SucheAnfangExe
  845.     cmp.b   #' ',(a1)           ;Leerzeichen
  846.     bne.s   keinLeerCom         ;keins
  847.     lea     1(a1),a1            ;sonst ein weiter
  848. keinLeerCom
  849.     move.l  DOSBase(a5),a6      ;a6=DOS Base
  850.     move.l  a1,a4               ;a4=Addr. des Auszuführenden Strings
  851. ComCDTest
  852.     move.b  (a1)+,d0            ;d0=ein Buchstabe
  853.     tst.b   d0                  ;Null Byte?
  854.     beq.s   ComEnde             ;JA
  855.     cmp.b   #'[',d0             ;suche Klammer
  856.     bne.s   ComCDTest           ;keine
  857.     cmp.w   #'C]',(a1)          ;dannach C]
  858.     bne.s   ComCDTest           ;Nein
  859.     move.b  #0,-2(a1)           ;vor der Klammer mit NULL abschließen
  860.     move.l  a4,d1               ;d1=Ausführbarer String
  861.     jsr     _LVOFilePart(a6)    ;Filename suchen
  862.     move.l  a4,d1               ;d1=Pfad
  863.     move.l  d0,a4               ;a4=Filename
  864.     move.b  #0,-1(a4)           ;Null Byte zwischen Pfad und Filenamen
  865.     move.l  #ACCESS_READ,d2     ;d2=Lesend
  866.     jsr     _LVOLock(a6)        ;Besetzen
  867.     move.l  d0,ProgrammDir(a5)  ;Lock Addr. des Programm Dir
  868.     move.l  d0,d1               ;d1=Lock Addr. des Programm Dir
  869.     jsr     _LVOCurrentDir(a6)  ;wechseln des Verzeichnisses
  870.     move.l  d0,AltesDir(a5)     ;Addr. des alten Verzeichnisses
  871. ComEnde
  872.     lea     AysnchOut(pc),a0    ;a0=AusgabeFenster Daten
  873.     move.l  a0,d1               ;d1=Fenster
  874.     move.l  #MODE_OLDFILE,d2    ;d2=AcessMode
  875.     jsr     _LVOOpen(a6)        ;Fenster Öffnen
  876.     lea     SystemExeTags(pc),a0 ;a0=SystemTags
  877.     move.l  d0,4(a0)            ;FileHandle eintragen als SYS_input
  878.     move.l  a0,d2               ;d2=Tags
  879.     move.l  a4,d1               ;d1=Commando
  880.     jsr     _LVOSystemTagList(a6) ;Commando ausführen
  881.     move.l  AltesDir(a5),d1     ;d1=altes Verzeichnis
  882.     tst.l   d1                  ;Überhaupt vorhanden
  883.     beq.s   KeinVerzWechsle     ;NEIN
  884.     jsr     _LVOCurrentDir(a6)  ;wechsel zum alten Verzeichnis
  885.     move.l  ProgrammDir(a5),d1  ;d1=Programm Dir
  886.     jsr     _LVOUnLock(a6)      ;wieder freigeben
  887. KeinVerzWechsle
  888.     moveq   #10,d7              ;10=Startup warn Meldung
  889.     rts
  890. ;;
  891. ** TastenAuswertung
  892. UpTaste
  893.     move.l  AnGad(a5),a4             ;a4=Angewähltes Gadget
  894.     move.w  AnPage(a5),d5            ;d5=Angewählte Seite
  895.     lea     GadgetPage(a5),a3        ;a3=GadgetListe Addr. abhängig von der Seite
  896.     lea     (a3,d5.w),a3
  897.     move.l  (a3),a3
  898.     cmp.l   a3,a4                    ;vergleiche
  899.     beq.w   DownShift                ;erstes Gadget der Seite
  900.     lea     -4(a4),a3                ;a3=voriges Gadget
  901.     bra.s   GadAnwaehlen             ;und anwählen
  902. DownTaste
  903.     move.l  AnGad(a5),a4             ;a4=Angewähltes Gadget
  904.     move.w  AnPage(a5),d5            ;d5=Angewählte Seite
  905.     lea     4(a4),a3                 ;a3=nächstes Gadget
  906.     cmp.l   #0,(a3)                  ;keins mehr?
  907.     beq.w   UpShift                  ;JA
  908. GadAnwaehlen
  909.     move.l  (a4),a4                  ;Addr. Angewähltes Gadget
  910.     moveq   #0,d6                    ;d6=nicht aktive
  911.     bsr.w   SelGK                    ;Gadget bearbeiten
  912.     moveq   #1,d6                    ;d6=aktive
  913.     move.l  (a3),a4                  ;a4=jetzige Gadget
  914.     bsr.w   SelGK                    ;Gadget bearbeiten
  915.     move.l  a3,AnGad(a5)             ;neues angewähltes Gadget Addr.
  916.     bra.w   nocheine
  917. rechteBank
  918.     bsr.w   NummerGad                ;Daten anlegen
  919.     tst.w   NaechsteSPLaenge(a5)     ;Nächste Spalten Länge=0?
  920.     beq.s   letztesGDAnw             ;Letztes Gadget anwählen
  921.     move.w  NaechsteSPLaenge(a5),d0  ;d0=Nächste Spalten Länge
  922.     move.w  RelativeGDPos(a5),d1     ;d1=Relative Gadget Position vom Anfang der Spalte
  923.     tst.b   NaechsteSPSeiten(a5)     ;Nächste Spalte neue Seite?
  924.     bne.s   NeueSeitebeiRechts       ;JA
  925.     cmp.w   d0,d1                    ;vergleiche
  926.     bgt.s   RechteSpalteKleiner      ;nächste Spalte kürzer
  927.     move.w  JetztigeSPLaenge(a5),d0  ;d0=Jetzige Spalten länge
  928.     add.w   d4,d0                    ;d4=Anzahl der Gadgets bis ausgewähltem
  929.     bra.s   DieSelbigeSeite          ;d0=Anzahl der Gadgets bis Nächste Spalte
  930. RechteSpalteKleiner
  931.     add.w   d0,d4                    ;d4=Nächste Spalte irgendwo in der Mitter
  932.     move.w  JetztigeSPLaenge(a5),d0  ;d0=Jetzige Spalten länge
  933.     sub.w   d1,d0                    ;d0=Rest der jetzigen Spalte
  934.     add.w   d4,d0                    ;d0=Am Ende der Nächsten Spalte
  935.     bra.s   DieSelbigeSeite 
  936. NeueSeitebeiRechts
  937.     moveq   #4,d5                    ;d5=Nächste Seite
  938.     cmp.w   d0,d1                    ;Nächste Spalte größer ?
  939.     bgt.s   SpaltePasst              ;JA
  940.     move.w  d1,d0                    ;d0=Nächste Spalten Länge
  941. SpaltePasst
  942.     bra.b   NeueSeite                ;Neu Seite init
  943. letztesGDAnw
  944.     move.w  JetztigeSeite(a5),d0     ;d0=Jetzige Seiten länge
  945. DieSelbigeSeite
  946.     subq    #1,d0                    ;d0=Gadget Anzahl vom Anfang bis zum angewähltem
  947. DieSelbige2Seite    
  948.     add.w   d0,d0                    ;*4
  949.     add.w   d0,d0
  950.     move.w  AnPage(a5),d5            ;d5=Angewählte Seite
  951.     move.l  AnGad(a5),a4             ;a4=Angewähltes Gadget
  952.     lea     GadgetPage(a5),a3        ;a3=GadgetList für die angebene Seite
  953.     lea     (a3,d5.w),a3
  954.     move.l  (a3),a3
  955.     lea     (a3,d0.w),a3             ;a3=Addr. des anzuwählenden Gadgets
  956.     bra.b   GadAnwaehlen
  957. linkeBank
  958.     bsr.w   NummerGad                ;Längen init
  959.     tst.w   VorigeSPLaenge(a5)       ;Vorige Spalten Länge=0?
  960.     beq.s   erstesGDAnw              ;JA erstes Gadget anwählen
  961.     tst.b   VorigeSPSeiten(a5)       ;Vorige Spalte neue Seite?
  962.     bne.s   NeueSeitebeiLinks        ;JA
  963.     move.w  VorigeSPLaenge(a5),d0    ;d0=Vorige Spalten Länge
  964.     move.w  RelativeGDPos(a5),d1     ;d1=Relative Gadget Position vom Anfang der Spalte
  965.     cmp.w   d0,d1                    ;Jetzige Spalte länger
  966.     bhi.s   LinkeSpalteKleiner       ;Vorige Spalte kleiner
  967.     sub.w   d0,d4                    ;d4=aktuelle Position-vorige Spalten länge
  968.     move.w  d4,d0                    ;d0=neues Gadget
  969.     bra.b   DieSelbigeSeite
  970. LinkeSpalteKleiner
  971.     move.w  d4,d0                    ;d0=aktuelle Position
  972.     sub.w   d1,d0                    ;d0=aktuelle Position-relative Position
  973.     bra.b   DieSelbigeSeite
  974. erstesGDAnw
  975.     moveq   #1,d0                    ;erstes Gadget
  976.     bra.b   DieSelbigeSeite
  977. NeueSeitebeiLinks
  978.     moveq   #-4,d5                   ;vorige Seite
  979.     move.w  VorigeSeitenLaenge(a5),d0 ;d0=Vorige Seiten Länge
  980.     move.w  VorigeSPLaenge(a5),d1    ;d1=Vorige Spalten Länge
  981.     move.w  RelativeGDPos(a5),d2     ;d2=relative Position
  982.     cmp.w   d1,d2                    ;vorige Spalte kleiner als jetzige Position
  983.     bgt.s   NeueSeite                ;JA
  984.     sub.w   d1,d0
  985.     add.w   d2,d0                    ;d0=neue Gadget Position
  986. ** NeueSeite
  987. * d0 = Neues Angewähltes GadgetNr. relative zum Anfang
  988. * d5 = Neue SeitenNummer
  989. NeueSeite
  990.     subq    #1,d0                    ;d0=GadgetAnzahl-1
  991. NeueSeite2  
  992.     add.w   AnPage(a5),d5            ;d5=Angewählte Seite
  993. NeueSeite3
  994.     move.l  AnGad(a5),a4             ;a4=Angewähltes Gadget
  995.     cmp.b   #36,d5                   ;10. Seite
  996.     bgt.w   nocheine                 ;JA
  997.     move.w  d0,d7                    ;d7=neue Gadget Position
  998.     move.l  (a4),a4                  ;a4=Gadget Addr.
  999.     moveq   #0,d6                    ;d6=nichtangewählt
  1000.     bsr.w   SelGK                    ;Gadget Status setzen
  1001.     bsr.w   ReGadList                ;GadgetListe entfernen
  1002.     move.w  d5,AnPage(a5)            ;neue Seite
  1003.     bsr.w   AddGadList               ;GadgetListe hinzufügen
  1004.     add.w   d7,d7                    ;d7*4
  1005.     add.w   d7,d7
  1006.     lea     GadgetPage(a5),a3        ;a3=GadgetListe Addr.
  1007.     lea     (a3,d5.w),a3
  1008.     move.l  (a3),a3                  ;a3=Gadgets
  1009.     lea     (a3,d7.w),a3             ;a3=neues anzuwählendes Gadget
  1010.     moveq   #0,d7                    ;d7=0 (damit keine Fehler vorliegt)
  1011.     moveq   #1,d6                    ;d6=Gadget anwählen
  1012.     move.l  (a3),a4                  ;a4=GadgetAddr.
  1013.     bsr.w   SelGK                    ;Gadgetanwählen
  1014.     move.l  a3,AnGad(a5)             ;Angewähltes Gadget
  1015.     bsr.w   PrintIUnter              ;TextAusgabe
  1016.     bra.w   nocheine
  1017. ;;
  1018. ** NummerGad
  1019. NummerGad
  1020.     move.l  AnGad(a5),a4             ;a4=Angewähltes Gadget
  1021.     move.l  (a4),a3                  ;a3=Gadget Addr.
  1022.     move.w  gg_GadgetID(a3),d6       ;d6=GadgetID Nr.
  1023.     bsr.w   MenuDataInit             ;BangerMenuStruktur->a4
  1024.     lea     BaM_SpaltenLaenge(a4),a3 ;a3=SpaltenLängeAddr.
  1025.     lea     BaM_GadgetLaenge(a4),a2  ;a2=GadgetLängeAddr.
  1026.     moveq   #0,d5
  1027.     move.b  BaM_SpaltenAnzahl(a4),d5 ;d5=SpaltenAnzahl
  1028.     tst.b   d5                       ;Spalten Ohne Title ?
  1029.     bpl.s   keineUnsinnigeSpalte     ;Nein
  1030.     neg.b   d5
  1031. keineUnsinnigeSpalte
  1032.     subq    #1,d5                    ;d5=SpaltenAnzahl-1
  1033.     move.w  #0,VorigeSPLaenge(a5)    ;VorigeSpaltenLänge
  1034.     moveq   #0,d0
  1035.     moveq   #20,d2                   ;d2=Breite der Gadgets insgesamt
  1036.     move.w  d6,d4                    ;d4=GadgetID Nr.
  1037.     move.b  (a3),d0                  ;d0=SpaltenLänge
  1038.     move.w  d0,ErsteSPLaenge(a5)     ;ErsteSpaltenLänge
  1039. SpaltenHochZLoop
  1040.     bsr.w   SCBreiteBestimmen        ;GadgetLänge in Breite umwandeln
  1041.     cmp.w   SCBreite(a5),d2          ;mit ScreenBreite vergleichen
  1042.     bhi.w   SeiteNeuBeiSpalte        ;d2 höher neue Seite
  1043.     move.b  #0,VorigeSPSeiten(a5)    ;keine Neue Seite bei voriger Spalte
  1044. VorigeSeiteKoori
  1045.     sub.w   d0,d6                    ;d6=GadgetNr.-SpaltenLänge
  1046.     cmp.w   #1,d6                    ;vergleich mit 1
  1047.     blt.s   GadgetSpalteGef          ;Spalte gefunden wo Gadget sich befindet
  1048.     move.w  d0,VorigeSPLaenge(a5)    ;vorigeSpaltenLänge Koorigieren
  1049.     add.w   #20,d2                   ;d2=Breite der Gadget insgesamt
  1050.     dbra    d5,SpaltenHochZLoop      ;solange bis keine Spalten mehr vorhanden sind
  1051. GadgetSpalteGef
  1052.     add.w   #20,d2                   ;d2=Breite der Gadgets insgesamt
  1053.     move.w  d0,JetztigeSPLaenge(a5)  ;JetzigeSpaltenLänge
  1054.     add.w   d6,d0
  1055.     move.w  d0,RelativeGDPos(a5)
  1056.     tst.b   d5                       ;Noch Spalten vorhanden
  1057.     beq.s   keineSpaltenLaengen      ;Nein
  1058.     subq    #1,d5                    ;Spaltenanzahl koorigieren
  1059.     moveq   #0,d0
  1060.     bsr.s   SCBreiteBestimmen        ;GadgetLänge in Breite umwandeln
  1061.     move.w  d0,NaechsteSPLaenge(a5)  ;NächsteSpaltenLänge
  1062.     cmp.w   SCBreite(a5),d2          ;Neue Seite?
  1063.     bhi.s   SeiteNeuBeiNaechster     ;JA
  1064.     move.b  #0,NaechsteSPSeiten(a5)  ;keine Neue Seite bei nächster Seite
  1065.     subq    #1,d5                    ;Spaltenanzahl koorigieren
  1066.     bmi.s   Korri1KeineSpalten
  1067. NaechsteSeiteKoori
  1068.     add.w   #20,d2                   ;d2=GadgetBreite
  1069.     sub.w   d0,d6                    ;d6=negtive GadgetAnzahl
  1070.     bsr.s   SCBreiteBestimmen        ;GadgetLänge in Breite umwandeln
  1071.     cmp.w   SCBreite(a5),d2          ;Breiter als Screen ?
  1072.     bhi.s   SeiteNeuBei2Naechster    ;JA
  1073.     dbra    d5,NaechsteSeiteKoori    ;solange bis keine Spalten mehr da sind
  1074. Korri1KeineSpalten
  1075.     sub.w   d0,d6                    ;d6=negtive GadgetAnzahl
  1076. KorriKeineSpalten
  1077.     move.b  -(a3),d0                 ;d0=Letzte Spalten Länge
  1078.     move.w  d0,LetzteSPLaenge(a5)    ;Letzte Spalten Länge
  1079. SeiteRueckKorr
  1080.     neg.w   d6                       ;d6=GadgetAnzahl seit angewähltes Gadget
  1081.     add.w   d4,d6                    ;d6=GadgetAnzahl der Seite
  1082.     move.w  d6,JetztigeSeite(a5)     ;GadgetAnzahl der jetzigen Seite
  1083.     rts
  1084. keineSpaltenLaengen
  1085.     move.b  #0,NaechsteSPSeiten(a5)  ;Nächste Spalte neue Seite: Nein
  1086.     move.w  #0,NaechsteSPLaenge(a5)  ;NächsteSpaltenLänge=0
  1087.     bra.s   KorriKeineSpalten
  1088. SCBreiteBestimmen
  1089.     move.b  (a3)+,d0                 ;d0=SpaltenLänge
  1090.     moveq   #0,d1
  1091.     move.b  (a2)+,d1                 ;d1=GadgetLänge
  1092. GadgetLaengeBerechne
  1093.     asl.w   #3,d1                    ;d1*8 (Pixelgröße)
  1094.     add.w   #10,d1                   ;d1+10
  1095.     add.w   d1,d2                    ;d2=Breite bislang
  1096.     rts
  1097. SeiteNeuBeiSpalte
  1098.     moveq   #20,d2
  1099.     moveq   #0,d1
  1100.     move.b  -1(a2),d1                ;d1=GadgetLänge
  1101.     bsr.s   GadgetLaengeBerechne
  1102.     sub.w   d6,d4                    ;d4=VorigeGadgetAnzahl
  1103.     move.w  d4,VorigeSeitenLaenge(a5) ;VorigeGadgetAnzahl
  1104.     move.w  d6,d4                    ;d4=noch vorhandene Gadgets bis angewähltes
  1105.     move.b  #1,VorigeSPSeiten(a5)
  1106.     move.w  d0,ErsteSPLaenge(a5)     ;ErsteSpaltenLänge koorigieren
  1107.     bra.w   VorigeSeiteKoori
  1108. SeiteNeuBeiNaechster
  1109.     move.b  #1,NaechsteSPSeiten(a5)  ;Nächste Spalte neue Seite
  1110. SeiteNeuBei2Naechster
  1111.     move.b  -2(a3),d0                ;d0=Letzte Spalten Länge
  1112.     move.w  d0,LetzteSPLaenge(a5)    ;Letzte Spalten Länge
  1113.     bra.s   SeiteRueckKorr
  1114. ;;
  1115. ** Auswertung PageLeft/PageRight Ctrl Shift
  1116. PageLGAn
  1117.     moveq   #-4,d5                   ;d5=vorige Seite
  1118. NeueSeiteLeft
  1119.     moveq   #0,d0                    ;erstes Gadget
  1120.     bra.w   NeueSeite2
  1121. PageRGAn
  1122.     moveq   #4,d5                    ;d5=nächste Seite
  1123.     bra.s   NeueSeiteLeft
  1124. rechtsCtrl
  1125.     bsr.w   MenuDataInit             ;BangerMenu Struktur init
  1126.     moveq   #0,d1
  1127.     move.b  BaM_SeitenAnzahl(a4),d1  ;Seiten Anzahl
  1128.     tst.b   d1                       ;nur eine Seite?
  1129.     beq.w   letztesGDAnw             ;JA
  1130.     cmp.w   AnPage(a5),d1            ;Angewählte Seite=letzte Seite?
  1131.     bne.s   PageRGAn                 ;Nein
  1132.     moveq   #0,d5                    ;erste Seite
  1133.     moveq   #0,d0                    ;erstes Gadget
  1134.     bra.w   NeueSeite3
  1135. linkeCtrl
  1136.     bsr.w   MenuDataInit             ;BangerMenu Struktur init
  1137.     tst.w   AnPage(a5)               ;Angewählte Seite=0
  1138.     bne.s   PageLGAn                 ;Nein
  1139.     moveq   #0,d0                    ;erstes Gadget
  1140.     moveq   #0,d5
  1141.     move.b  BaM_SeitenAnzahl(a4),d5  ;d5=letzte Seite
  1142.     tst.b   d5                       ;nur eine Seite?
  1143.     beq.w   DieSelbige2Seite         ;JA
  1144.     bra.w   NeueSeite3
  1145. UpShift
  1146.     bsr.w   NummerGad                ;Längen init
  1147.     move.w  RelativeGDPos(a5),d1     ;d1=Relative Gadget Position
  1148.     sub.w   d1,d4                    ;d4=Spalten Anfang
  1149.     move.w  d4,d0                    ;d0=Spalten Anfang
  1150.     bra.w   DieSelbige2Seite
  1151. DownShift
  1152.     bsr.w   NummerGad                ;Längen init
  1153.     move.w  JetztigeSPLaenge(a5),d0  ;d0=Jetzige Spalten Länge
  1154.     move.w  RelativeGDPos(a5),d1     ;d1=Relative Gadget Position
  1155.     sub.w   d1,d0                    ;d0=Rest der Spalte
  1156.     add.w   d4,d0                    ;d0=ende der Spalte
  1157.     bra.w   DieSelbigeSeite
  1158. linkeShift
  1159.     bsr.w   NummerGad                ;Längen init
  1160.     move.w  RelativeGDPos(a5),d0     ;d0=Relative Position
  1161.     move.w  ErsteSPLaenge(a5),d1     ;d1=Erste Spalten Länge
  1162.     cmp.w   d0,d1                    ;erste Spalte Länger?
  1163.     bgt.s   ShiftLinksPasst          ;JA
  1164.     move.w  d1,d0                    ;ende der ersten Spalte
  1165. ShiftLinksPasst
  1166.     bra.w   DieSelbigeSeite
  1167. rechtsShift
  1168.     bsr.w   NummerGad                ;Längen init
  1169.     move.w  JetztigeSeite(a5),d0     ;d0=Jetzige Seiten länge
  1170.     move.w  LetzteSPLaenge(a5),d1    ;d1=Letzte Spalten Länge
  1171.     sub.w   RelativeGDPos(a5),d1     ;d1=Relative Position abgezogen
  1172.     bmi.s   ShiftRechtsPasst         ;negative dann zu kurz
  1173.     sub.w   d1,d0                    ;d0=letzte Spalte
  1174. ShiftRechtsPasst
  1175.     bra.w   DieSelbigeSeite
  1176. ;;
  1177. **SelGK Selektiert Gadget also ein oder aus
  1178. SelGK
  1179.     bsr.b   RemoveGSuche          ;Entferne Gadget
  1180.     tst.l   d6                    ;d6=0/1
  1181.     beq.s   DisSel                ;nicht aktivieren
  1182.     or.w    #GFLG_SELECTED,gg_Flags(a4) ;angewählt Flag setzen
  1183.     bra.s   NunSel
  1184. DisSel
  1185.     eor.w   #GFLG_SELECTED,gg_Flags(a4) ;nicht angewählt Flag setzen
  1186. NunSel
  1187.     bsr.b   AddGSuche             ;Gadget wieder einfügen
  1188.     rts
  1189. RemoveGSuche
  1190.     move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
  1191.     move.l  a4,a1                 ;a1=Gadget Addr.
  1192.     move.l  INTUIBase(a5),a6      ;a6=Intuition Base
  1193.     jsr     _LVORemoveGadget(a6)  ;Entferne Gadget
  1194.     rts
  1195. AddGSuche
  1196.     move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
  1197.     move.l  a4,a1                 ;a1=Gadget Addr.
  1198.     moveq   #-1,d0                ;d0=als letztes
  1199.     jsr     _LVOAddGadget(a6)     ;Gadget Einfügen
  1200.     move.l  a4,a0                 ;a0=Gadget Addr.
  1201.     move.l  WindowHandle(a5),a1   ;a1=Fenster Addr.
  1202.     suba.l  a2,a2                 ;a2=keine TAGS
  1203.     jsr     _LVORefreshGadgets(a6) ;Zeichne Gadget neu
  1204.     rts
  1205. ReGadList
  1206.     move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
  1207.     lea     GadgetListe(a5),a1    ;a1=Gadget Liste für alle 10 Seiten
  1208.     move.w  AnPage(a5),d4         ;d4=angewählte Seite
  1209.     lea     (a1,d4.w),a1
  1210.     move.l  (a1),a1
  1211.     moveq   #-1,d0                ;d0=alle
  1212.     move.l  INTUIBase(a5),a6      ;a6=Intuitions Base
  1213.     jsr     _LVORemoveGList(a6)   ;Entferne GadgetListe
  1214.     move.l  WinRPort(a5),a1       ;a1=Fenster RastPort
  1215.     moveq   #0,d0                 ;d0=Hintergrund Farbe
  1216.     move.l  GFXBase(a5),a6        ;a6=GFX Base
  1217.     jsr     _LVOSetAPen(a6)       ;Zeichenstift auf Hintergrundfarbe setzen
  1218.     move.l  WinRPort(a5),a1       ;a1=Fenster RastPort
  1219.     moveq   #2,d0                 ;d0=Linke Ecke
  1220.     moveq   #2,d1                 ;d1=Obere Ecke
  1221.     add.b   RelativeLeftC(a5),d0  ;+Relative Linke Koordinate
  1222.     add.b   RelativeTopC(a5),d1   ;+Relative Obere Koordinate
  1223.     move.w  BreiteWin(a5),d2      ;d2=Fenster Breite
  1224.     subq    #5,d2                 ;Fenster Breite-5
  1225.     move.w  HoeheWin(a5),d3       ;d3=Fenster Höhe
  1226.     subq    #5,d3                 ;Fenster Höhe-5
  1227.     jsr     _LVORectFill(a6)      ;Fülle Rechteck aus
  1228.     rts
  1229. AddGadList
  1230.     move.l  WindowHandle(a5),a0   ;a0=Fenster Addr.
  1231.     lea     GadgetListe(a5),a3    ;a3=Gadget Liste für alle 10 Seiten
  1232.     lea     (a3,d5.w),a3          ;d5=angewählte Seite
  1233.     move.l  (a3),a1               ;a1=GadgetListe
  1234.     moveq   #2,d0                 ;d0=ab 2. Position
  1235.     moveq   #-1,d1                ;d1=alle Gadgets
  1236.     suba.l  a2,a2                 ;a2=keine RequesterGadgets
  1237.     move.l  INTUIBase(a5),a6      ;a6=Intuition Base
  1238.     jsr     _LVOAddGList(a6)      ;Füge Gadgets hinzu
  1239.     move.l  (a3),a0               ;a0=GadgetListe
  1240.     move.l  WindowHandle(a5),a1   ;a1=Fenster Addr.
  1241.     suba.l  a2,a2                 ;a2=keine Requestergadgets
  1242.     moveq   #-1,d0                ;d0=alle Gadgets
  1243.     jsr     _LVORefreshGList(a6)  ;Zeichne GadgetListe neu
  1244.     bsr.s   RefreshWin            ;Zeichne Fenster neu
  1245.     rts
  1246. ;;
  1247. ;;
  1248. ** Refresh Fenster
  1249. RefreshWin
  1250.     move.l  GADBase(a5),a6          ;GadTools Base
  1251.     move.l  WindowHandle(a5),a0     ;Fenster Addr.
  1252.     suba.l  a1,a1                   ;keine TAGS
  1253.     jsr     _LVOGT_RefreshWindow(a6) ;Neu Zeichnen des Fenster
  1254.     move.l  WindowHandle(a5),a0     ;Fenster Addr.
  1255.     jsr     _LVOGT_BeginRefresh(a6) ;Beginne mit dem Zeichnen
  1256.     move.l  WindowHandle(a5),a0     ;Fenster Addr.
  1257.     moveq   #DOSTRUE,d0
  1258.     jsr     _LVOGT_EndRefresh(a6)   ;Beende Zeichen
  1259.     rts 
  1260. ;;
  1261. ** Fenster Öffnen
  1262. FensterOeffne
  1263.     move.l  INTUIBase(a5),a6        ;Intuition Base
  1264.     lea     Fenster_Tags(pc),a1     ;Fenster Tags
  1265.     move.l  GadgetListe(a5),12(a1)  ;Gadget Liste
  1266.     move.l  ScreenHandle(a5),60(a1) ;Screen Addr.
  1267.     lea     WindowTitle(pc),a0      ;Fenster Titel
  1268.     move.l  a0,4(a1)
  1269.     lea     ScreenTitle(pc),a0      ;Screen Titel
  1270.     move.l  a0,20(a1)
  1271.     move.w  BreiteWin(a5),d0        ;Breite des Fensters
  1272.     move.w  d0,30(a1)
  1273.     sub.w   SCBreite(a5),d0         ;-Screen Breite
  1274.     neg.w   d0                      ;negieren
  1275.     asr.w   #1,d0                   ;/2
  1276.     move.w  d0,54(a1)
  1277.     move.w  HoeheWin(a5),d4         ;Höhe Fenster
  1278.     move.w  d4,38(a1)
  1279.     move.w  SCHoehe(a5),d0          ;Screen Höhe
  1280.     add.w   #50,d0                  ;+50
  1281.     sub.w   d4,d0                   ;Höhe Fenster - Screen Höhe
  1282.     asr.w   #1,d0                   ;/2
  1283.     move.w  d0,46(a1)
  1284.     suba.l  a0,a0                   ;keine NewFenster Struktur
  1285.     jsr     _LVOOpenWindowTagList(a6) ;Fenster Öffnen
  1286.     move.l  d0,WindowHandle(a5)     ;Fenster Addr.
  1287.     beq.b   ErrorWindow             ;Fehler ?
  1288.     move.l  d0,a0
  1289.     move.l  wd_RPort(a0),WinRPort(a5) ;Window RasrPort Addr.
  1290.     move.l  4.w,a6                  ;EXECBase
  1291.     suba.l  a1,a1                   ;eigenen Task finden
  1292.     jsr     _LVOFindTask(a6)        ;Finde Task
  1293.     move.l  d0,meinTask(a5)         ;Task Addr.
  1294.     beq.s   ErrorTask               ;Fehler
  1295.     move.l  d0,a0
  1296.     move.l  pr_WindowPtr(a0),alterTask(a5) ;Alten Task sichern
  1297.     move.l  WindowHandle(a5),pr_WindowPtr(a0) ;eigenes Fenster einsetzen
  1298.     rts
  1299. ErrorTask
  1300.     bsr.s   keinTask
  1301. ErrorWindow
  1302.     moveq   #26,d7                  ;26 = konnte Fenster nicht öffnen oder Task nicht finden
  1303.     rts
  1304. FensterSchliesse
  1305.     move.l  meinTask(a5),a0         ;Task Addr.
  1306.     move.l  alterTask(a5),pr_WindowPtr(a0) ;wieder alten Task einsetzen
  1307. keinTask
  1308.     move.l  INTUIBase(a5),a6        ;Intuition Base
  1309.     move.l  WindowHandle(a5),a0     ;Fenster Addr.
  1310.     jsr     _LVOCloseWindow(a6)     ;Schliesse Fenster
  1311.     rts 
  1312. ;;
  1313. ** GadgetListeInit
  1314. * d0=WelcheSeite
  1315. * a3=GadgetAddr
  1316. *    a0=Pointer für CreateGadget
  1317. GadgetListeInit
  1318.     lea     PrintPage(a5),a1            ;Text Ausgabe Data für welche Seite
  1319.     move.l  PrintMarkTab(a5),(a1,d0.w)  ;TextMarke
  1320.     lea     GadgetPage(a5),a1           ;Gadget Liste für welche Seite
  1321.     move.l  a3,(a1,d0.w)                ;GadgetAddr
  1322.     lea     GadgetListe(a5),a0          ;GadgetList für welche Seite
  1323.     lea     (a0,d0.w),a0
  1324.     move.l  GADBase(a5),a6
  1325.     jsr     _LVOCreateContext(a6)       ;Erschaffe Gadget Grundgerüst
  1326.     move.l  d0,a0
  1327.     beq.w   ErrorGadget                 ;Fehler ?
  1328.     rts
  1329. ;;
  1330. ** InitGadget
  1331. InitGadget
  1332.     lea     PrintData(a5),a1            ;Spalten Text Data
  1333.     move.l  a1,PrintMarkTab(a5)         ;Text Marke
  1334.     moveq   #it_SIZEOF*5,d0
  1335. LoescheTextData
  1336.     move.l  #0,(a1)+                    ;Lösche Speicher
  1337.     dbra    d0,LoescheTextData
  1338.     move.b  #0,SpalteOhneTitle(a5)
  1339.     bsr.w   MenuDataInit                ;MenuDaten holen
  1340.     moveq   #0,d6
  1341.     move.b  #0,BaM_SeitenAnzahl(a4)     ;Seiten Anzahl = 0
  1342.     move.b  BaM_SpaltenAnzahl(a4),d6    ;Spalten Anzahl --> d6
  1343.     tst.b   d6
  1344.     bpl.s   NormalSpaltenMitTitle       ;d6 positive --> Spalte mit Title
  1345.     neg.b   d6                          ;jetzt richtige Spaltenanzahl
  1346.     move.b  #1,SpalteOhneTitle(a5)      ;Erkennung Spalte ohne Title
  1347. NormalSpaltenMitTitle
  1348.     subq    #1,d6
  1349.     lea     GadgetAddr(a5),a3           ;GadgetAddrListe
  1350.     moveq   #0,d0                       ;Seite 0
  1351.     bsr.s   GadgetListeInit             ;Erste Seite Init
  1352.     moveq   #0,d3
  1353. SpaltenLoop
  1354. * a0=GadgetCreatepointer
  1355. * a3=GadgetAddressen speicher
  1356. * a4=BangerMenu-Struct (data)
  1357. * d3=GadgetText (später nach Schleife Ende init)
  1358. * d6=Spalten Anzahl
  1359.     moveq   #0,d0
  1360.     move.b  BaM_SpaltenAnzahl(a4),d0    ;Spalten Anzahl
  1361.     tst.b   d0                          ;positive
  1362.     bpl.s   NormalSpalten2MitTitle      ;JA
  1363.     neg.b   d0                          ;sonst 1 Spalte
  1364. NormalSpalten2MitTitle
  1365.     sub.b   d6,d0
  1366.     subq    #1,d0
  1367.     lea     BaM_SpaltenLaenge(a4),a1    ;Addr. Spalten Länge
  1368.     lea     (a1,d0.w),a1
  1369.     moveq   #0,d5
  1370.     move.b  (a1),d5                     ;Spalten Länge-->d5
  1371.     move.w  d5,d2                       ;d2=Spalten Länge
  1372.     moveq   #10,d1
  1373.     mulu.w  d1,d2                       ;GadgetHöhe=10 * Länge
  1374.     add.w   #60,d2                      ;+60
  1375.     cmp.w   HoeheWin(a5),d2             ;vergleiche Höhe Fenster
  1376.     bls.s   WinGroesseBeh               ;Fenster ist kleiner
  1377.     move.w  d2,HoeheWin(a5)             ;Fenster verkleinern
  1378. WinGroesseBeh
  1379.     tst.b   d5                          ;Gadgets vorhanden ?
  1380.     beq.w   COLOhne                     ;keine
  1381.     subq    #1,d5
  1382.     lea     BaM_GadgetLaenge(a4),a1     ;Addr. Gadgetlänge
  1383.     lea     (a1,d0.w),a1
  1384.     moveq   #0,d4
  1385.     move.b  (a1),d4                     ;Gadgetlänge
  1386.     asl.w   #3,d4                       ;*8
  1387.     add.w   #10,d4                      ;+10
  1388.     lea     UniGad(pc),a1               ;Universal NewGadget Struktur
  1389.     move.w  gng_LeftEdge(a1),d1         ;d1=LinkeEcke
  1390.     move.w  d4,gng_Width(a1)            ;Gadgetlänge-->Gadgetbreite
  1391.     add.w   d4,d1                       ;LinkeEcke+Gadgetbreite
  1392.     cmp.w   SCBreite(a5),d1             ;vergleiche Screenbreite
  1393.     bhi.w   NeueSeiteInit               ;größer Neue Seite
  1394. SeitenRueckkehr
  1395.     lea     BaM_SpaltenTitleText(a4),a1 ;Addr. SpaltenTitelText
  1396.     add.w   d0,d0                       ;*4 (long)
  1397.     add.w   d0,d0
  1398.     lea     (a1,d0.w),a1
  1399.     move.l  (a1),a1                     ;SpaltenTitelText
  1400.     tst.b   SpalteOhneTitle(a5)         ;Spalte keinen Titel ?
  1401.     bne.s   GSNameRichtig               ;JA
  1402.     bsr.w   TextInit                    ;Spalten Titel Text Init
  1403.     tst.b   d3
  1404.     beq.s   ErsterGadNameFind           ;GadgetName einstellen
  1405.     move.l  d3,a2                       ;a2=GadgetName
  1406.     cmp.b   #$20,-1(a2)                 ;Leerzeichen davor ?
  1407.     beq.s   TauscheReg                  ;JA
  1408. ErsterGadNameFind
  1409.     tst.b   (a1)+                       ;im Prefs Text suchen
  1410.     bne.s   ErsterGadNameFind           ;noch nicht ende
  1411.     lea     1(a1),a1                    ;ein Zeichen über Springen
  1412. GSNameRichtig
  1413.     move.l  a1,d3                       ;d3=Addr. GadgetName
  1414. TauscheReg
  1415.     exg     a4,d3                       ;a4=Addr. GadgetName
  1416. InitGadloop
  1417. * a0=GadgetCreatepointer
  1418. * a3=GadgetAddressen speicher
  1419. * a4=GadgetText (aus der Konfig)
  1420. * d3=BangerMenuStruct
  1421. * d5=GadgetAnzahl pro Spalte
  1422. * d6=Spalten Anzahl
  1423.     moveq   #BUTTON_KIND,d0         ;Gadget Type:Knopf
  1424.     lea     UniGad(pc),a1           ;Universal NewGadgetStruktur
  1425.     move.l  a4,gng_GadgetText(a1)   ;GadgetText eintragen
  1426.     add.w   #10,gng_TopEdge(a1)     ;ObereEcke+10
  1427.     add.w   #1,gng_GadgetID(a1)     ;GadgetID Nr. +1
  1428.     suba.l  a2,a2                   ;keine TAGS
  1429.     move.l  GADBase(a5),a6          ;Gadtools Base
  1430.     jsr     _LVOCreateGadgetA(a6)   ;Gadget erschaffen
  1431.     move.l  d0,(a3)+                ;Addr. in GadgetAddressenliste eintragen
  1432.     beq.w   ErrorGadget             ;Fehler
  1433.     move.l  d0,a0                   ;a0=Addr. für nächste Gadget Erschaffung
  1434.     move.l  a4,gg_UserData(a0)      ;Addr. des GadgetNamen aus der Konfig
  1435.     bsr.w   Return2Find             ;Nächster Gadget String
  1436.     dbra    d5,InitGadloop          ;Alle Gadgets aus der Spalte
  1437.     lea     UniGad(pc),a1           ;Universal NewGadget Struktur
  1438.     move.w  #20,gng_TopEdge(a1)     ;ObereEcke=20
  1439.     move.b  RelativeTopC(a5),d0     ;Relative Obere Koordinate
  1440.     add.b   d0,gng_TopEdge+1(a1)    ;hinzu addieren
  1441.     move.w  gng_Width(a1),d0        ;d0=Gadgetbreite
  1442.     add.w   d0,gng_LeftEdge(a1)     ;LinkeEcke+Gadgetbreite
  1443.     add.w   #20,gng_LeftEdge(a1)    ;+Abstand(20)
  1444.     exg     d3,a4                   ;d3=GadgetText a4=BangerMenuStruktur
  1445. COLOhne 
  1446.     dbra    d6,SpaltenLoop          ;bis alle Spalen abgearbeitet sind
  1447.     lea     UniGad(pc),a1           ;Universal GadgetStruktur
  1448.     move.w  gng_LeftEdge(a1),d1     ;d1=LinkeEcke
  1449.     move.w  #20,gng_LeftEdge(a1)    ;LinkeEcke+20
  1450.     move.b  RelativeLeftC(a5),d0    ;d0=Relative Linke Koordinate
  1451.     add.b   d0,gng_LeftEdge+1(a1)   ;LinkeEcke+Relative Linke Koordinate
  1452.     move.w  #0,gng_GadgetID(a1)     ;GadgetIDNr.=0
  1453.     cmp.w   BreiteWin(a5),d1        ;vergleiche Fenster Breite
  1454.     bls.s   WinBreite2Beh           ;FensterBreite kleiner
  1455.     move.w  d1,BreiteWin(a5)        ;neue Fensterbreite
  1456. WinBreite2Beh
  1457.     tst.b   BaM_SeitenAnzahl(a4)    ;SeitenAnzahl=0?
  1458.     beq.s   GadgetEndeInit          ;JA
  1459.     bsr.w   SeitenGadgetInit        ;Seitengadgets einrichten
  1460. GadgetEndeInit
  1461.     move.b  #0,ZweitePage(a5)       ;keine Zweite Seite
  1462.     move.l  #0,(a3)                 ;GadgetListe abschließen
  1463.     rts
  1464. ;;
  1465. ** TextInit
  1466. * a0=GadgetCreatepointer
  1467. * a1=Zeiger auf Col Title Text
  1468. * a3=GadgetAddressen speicher
  1469. * a4=BangerMenu-Struct (data)
  1470. * d0=Spalte
  1471. * d3=GadgetText voriges Mal
  1472. * d5=GadgetAnzahl pro Spalte
  1473. * d6=Spalten Anzahl
  1474. TextInit
  1475.     movem.l a0-a4/d7,-(sp)                  ;Register sichern
  1476.     move.w  d0,d4                           ;d4=Spalte
  1477.     lea     UniGad(pc),a2                   ;Univeral NewGadgetStruktur
  1478.     move.w  gng_LeftEdge(a2),d7             ;d7=Linke Ecke
  1479.     move.w  gng_Width(a2),d2                ;d2=Gadgetbreite
  1480.     move.l  PrintMarkTab(a5),a2             ;a2=Text Marke
  1481.     lea     it_SIZEOF(a2),a3                ;a3=Addr. Nächste IntuiTextStruktur
  1482.     move.l  a3,it_NextText(a2)              ;Nächste IntuiTextStruk eintragen
  1483.     move.l  #$02000100,(a3)                 ;Texte Attribute setzen
  1484.     move.w  #19,it_TopEdge(a3)              ;ObereEcke=19
  1485.     move.l  FontAddr(a5),it_ITextFont(a3)   ;Zeichensatz eintragen
  1486.     move.l  a1,it_IText(a3)                 ;TextString eintragen
  1487.     move.l  a1,a0                           ;a0=SpaltenTitelText
  1488. TextEndeLoop
  1489.     tst.b   (a1)+                           ;Suche Null Byte
  1490.     bne.s   TextEndeLoop
  1491.     sub.l   a0,a1
  1492.     move.l  a1,d0                           ;d0=TextLänge
  1493.     subq    #1,d0                           ;Textlänge-1
  1494.     lsl.w   #3,d0                           ;Textlänge*8 in Pixeln
  1495.     sub.w   d0,d2                           ;Gadgetbreite-Textlänge
  1496.     bmi.s   TextZuLang                      ;Textlänge zu lang
  1497.     lsr.w   #1,d2                           ;Restlänge/2
  1498. TextKorritur
  1499.     add.w   d2,d7                           ;d7=LinkeEcke+Restlänge
  1500.     move.b  RelativeLeftC(a5),d2            ;Relative Koordinate abziehen
  1501.     sub.w   d2,d7
  1502.     bpl.s   nichtFensterRand                ;Noch positive Koordinate
  1503.     moveq   #0,d7                           ;Ansonsten LinkeEcke=0
  1504. nichtFensterRand
  1505.     move.w  d7,it_LeftEdge(a3)              ;LinkeEcke eintragen
  1506.     move.l  a3,PrintMarkTab(a5)             ;Text Marker setzen
  1507.     movem.l (sp)+,a0-a4/d7                  ;Alte Register wiederherstellen
  1508.     rts
  1509. TextZuLang
  1510.     neg.w   d2                              ;d2=wieder positive Länge
  1511.     lsr.w   #1,d2                           ;Länge zu viel /2
  1512.     neg.w   d2                              ;d2=negative RestLänge
  1513.     tst.b   d4                              ;erste Spalte
  1514.     beq.s   TextKorritur                    ;JA
  1515.     sub.b   d4,TextUOFlag(a5)               ;Spalte-Text unter/ober Flag
  1516.     beq.s   TextKorritur                    ;gleich Null
  1517.     addq    #1,d4                           ;Nächste Spalte
  1518.     move.b  d4,TextUOFlag(a5)               ;Markiere Nächste Spalte
  1519.     sub.w   #10,it_TopEdge(a3)              ;ObereEcke-10
  1520.     bra.s   TextKorritur
  1521. ;;
  1522. ** NeueSeiteInit
  1523. * a0=GadgetCreatepointer
  1524. * a3=GadgetAddressen speicher
  1525. * a4=BangerMenu-Struct (data)
  1526. * d0=Spalte
  1527. * d3=GadgetText (später nach Schleife Ende init)
  1528. * d5=GadgetAnzahl pro Spalte
  1529. * d6=Spalten Anzahl
  1530. NeueSeiteInit
  1531.     movem.l d0,-(sp)               ;d0 sichern
  1532.     bsr.s   SeitenGadgetInit       ;SeitenGadgets einrichten
  1533.     tst.b   d7                     ;Fehler ?
  1534.     beq.s   SeitenGadgOK           ;Nein
  1535.     rts
  1536. SeitenGadgOK    
  1537.     lea     UniGad(pc),a1          ;a1=Universal GadgetStruktur
  1538.     move.w  gng_LeftEdge(a1),d0    ;d0=LinkeEcke
  1539.     cmp.w   BreiteWin(a5),d0       ;vergleiche mit Fensterbreite
  1540.     bls.s   WinBreiteBeh           ;größer
  1541.     move.w  d0,BreiteWin(a5)       ;neue Fensterbreite,da kleiner
  1542. WinBreiteBeh
  1543.     move.w  #20,gng_LeftEdge(a1)   ;LinkeEcke=20
  1544.     move.b  RelativeLeftC(a5),d0   ;d0=Relative Linke Koordinate
  1545.     add.b   d0,gng_LeftEdge+1(a1)  ;LinkeEcke+Relative Linke Koordinate
  1546.     move.l  #0,(a3)+               ;GadgetListe abschliessen
  1547.     add.b   #4,BaM_SeitenAnzahl(a4) ;SeitenAnzahl+4 (=1 neue Seite)
  1548.     move.l  PrintMarkTab(a5),a1    ;a1=TextMarker
  1549.     move.l  #0,it_NextText(a1)     ;keine weiteren Texte mehr
  1550.     lea     it_SIZEOF(a1),a1       ;a1=Nächste Freie IntuiTextStruktur
  1551.     move.l  a1,PrintMarkTab(a5)    ;neue TextMarke
  1552.     moveq   #0,d0
  1553.     move.b  BaM_SeitenAnzahl(a4),d0 ;d0=jetzige Seite
  1554.     bsr.w   GadgetListeInit        ;Addr. für neue Seite einrichten
  1555.     tst.b   d7                     ;Fehler
  1556.     beq.s   NeueGadListeOK         ;Nein
  1557.     rts
  1558. NeueGadListeOK  
  1559.     movem.l (sp)+,d0               ;d0 wieder hergestellt
  1560.     bra.w   SeitenRueckkehr
  1561. ;;
  1562. ** SeitenGadgetInit
  1563. * a0=GadgetCreatepointer
  1564. * d6=Spalten Anzahl (ob noche eine Seite kommt oder nicht)
  1565. SeitenGadgetInit
  1566.     moveq   #0,d4
  1567.     move.b  BaM_SeitenAnzahl(a4),d4 ;d4=SeitenAnzahl
  1568.     moveq   #BUTTON_KIND,d0         ;Gadget Typ:Knopf
  1569.     lea     PageGads(pc),a1         ;SeitenGadgetStruktur
  1570.     tst.b   ZweitePage(a5)          ;Ist das die Zeite Seite?
  1571.     beq.s   kein1Seite              ;NEIM
  1572.     lea     PaGadTags2(pc),a2       ;Gadget Wählbar Tags
  1573.     bra.s   doch1Seite
  1574. kein1Seite
  1575.     lea     PaGadTags(pc),a2        ;Gadget NichtWählbar Tags
  1576. doch1Seite
  1577.     jsr     _LVOCreateGadgetA(a6)   ;Gadgeterschaffen
  1578.     tst.l   d0                      ;Fehler
  1579.     beq.b   ErrorGadget             ;JA
  1580.     move.l  d0,a0                   ;a0=SeitenGadgetAddr.
  1581.     lea     PageLAddr(a5),a1        ;vorige SeitenGadgetAddr. Liste
  1582.     lea     (a1,d4.w),a1            ;für diese Seite eintragen
  1583.     move.l  d0,(a1)
  1584.     moveq   #BUTTON_KIND,d0         ;GadgetTyp:Knopf
  1585.     lea     Page2Gads(pc),a1        ;Nächste Seite Gadget Struktur
  1586.     tst.b   d6                      ;Noch eine Spalte in bearbeitung ?
  1587.     bmi.s   kein2Seite              ;NEIN
  1588.     cmp.b   #36,d4                  ;10. Seite ?
  1589.     beq.s   kein2Seite              ;keine Neue Seite mehr
  1590.     lea     PaGadTags2(pc),a2       ;Gadget Wählbar Tags
  1591.     bra.s   doch2Seite
  1592. kein2Seite
  1593.     lea     PaGadTags(pc),a2        ;Gadget NichtWählbar Tags
  1594. doch2Seite
  1595.     jsr     _LVOCreateGadgetA(a6)   ;Gadgeterschaffen
  1596.     tst.l   d0                      ;Fehler
  1597.     beq.b   ErrorGadget             ;JA
  1598.     move.l  d0,a0
  1599.     lea     PageRAddr(a5),a1        ;nächste SeitenGadgetAddr. Liste
  1600.     lea     (a1,d4.w),a1
  1601.     move.l  d0,(a1)
  1602.     move.b  #1,ZweitePage(a5)       ;ZweiteSeite vorhanden
  1603.     rts
  1604. ;;
  1605. ** ErrorGadget
  1606. ErrorGadget
  1607.     bsr.s   RemoveGadget        ;Entferne Gadgets
  1608.     moveq   #25,d7              ;25 = Gadget init Fehler
  1609.     rts
  1610. RemoveGadget
  1611.     move.l  GADBase(a5),a6      ;GadTools Base
  1612.     bsr.w   MenuDataInit        ;a4=BangerMenuData Struktur laden
  1613.     moveq   #0,d4
  1614.     move.b  BaM_SeitenAnzahl(a4),d4 ;d4=SeitenAnzahl
  1615. GadListeFLoop   
  1616.     lea     GadgetListe(a5),a0  ;GadgetListe der einzelnen Seiten
  1617.     lea     (a0,d4.w),a0
  1618.     move.l  (a0),a0
  1619.     jsr     _LVOFreeGadgets(a6) ;Freigeben
  1620.     subq    #4,d4               ;Vorige Seite
  1621.     bpl.s   GadListeFLoop       ;Noch eine Seite
  1622.     rts 
  1623. Return2Find
  1624.     tst.b   (a4)+            ;Null Byte suchen
  1625.     bne.s   Return2Find
  1626. Return1Mal
  1627.     tst.b   (a4)+            ;Nochmal Null Byte suchen
  1628.     bne.s   Return1Mal
  1629.     cmp.b   #$20,(a4)        ;Leerzeichen ?
  1630.     bne.s   AltesKonfigFile  ;Nein so lassen
  1631.     lea     1(a4),a4         ;noch ein Zeichen
  1632. AltesKonfigFile 
  1633.     rts
  1634. ;;
  1635. ** Speicher freigeben von den Einstellungen
  1636. SpeicherPrefs
  1637.     move.l  FileSpeicher(a5),a1 ;Prefs File Speicher
  1638.     move.l  Filegroesse(a5),d0  ;Prefs File größe
  1639.     move.l  4.w,a6              ;EXECBase
  1640.     jsr     _LVOFreeMem(a6)     ;Gebe Speicher Frei
  1641.     rts
  1642. ;;
  1643. ** Lade Einstellungen
  1644. LadePrefs
  1645.     move.l  PrefsLoadKey(a5),d1     ;PrefsFilename
  1646.     tst.l   d1                      ;vorhanden
  1647.     bne.s   EigenesPrefsFile        ;JA!
  1648.     lea     PrefsFile1(pc),a3       ;Sonst im eigenem Verzeichnis suchen
  1649.     move.l  a3,d1
  1650. EigenesPrefsFile
  1651.     move.l  #MODE_OLDFILE,d2        ;nur lesend
  1652.     move.l  DOSBase(a5),a6          ;DOS
  1653.     jsr     _LVOOpen(a6)            ;Öffne File
  1654.     move.l  d0,PrefsFileHandle(a5)  ;File Addr.
  1655.     bne.s   OpenPrefsFile           ;JA!
  1656.     lea     PrefsFileName(pc),a3    ;Suche im S: Verzeichnis
  1657.     move.l  a3,d1
  1658.     move.l  #MODE_OLDFILE,d2        ;nur lesend
  1659.     jsr     _LVOOpen(a6)            ;Öffne File
  1660.     move.l  d0,PrefsFileHandle(a5)  ;File Addr.
  1661.     beq.s   OpenFileError           ;NEIN!
  1662. OpenPrefsFile
  1663.     move.l  d0,d1                   ;File Addr.
  1664.     lea     FIB(a5),a3              ;FIB=FileInfoBlock Struktur
  1665.     move.l  a3,d2
  1666.     jsr     _LVOExamineFH(a6)       ;FileInfoBlock Struktur füllen
  1667.     move.l  fib_Size(a3),d0         ;Filegröße
  1668.     addq    #1,d0                   ;+1
  1669.     move.l  d0,Filegroesse(a5)      ;Filegröße
  1670.     cmp.l   #1,d0                   ;Vergleiche mit 1
  1671.     beq.s   nixPrefs                ;Prefs Leer
  1672.     tst.l   d0                      ;=0
  1673.     beq.s   nixPrefs                ;PrefsLeer
  1674.     move.l  #MEMF_PUBLIC!MEMF_CLEAR,d1 ;Speicher Type
  1675.     move.l  4.w,a6                  ;EXECBase
  1676.     jsr     _LVOAllocMem(a6)        ;Reserviere Speicher
  1677.     move.l  d0,FileSpeicher(a5)     ;File Speicher
  1678.     beq.s   ErrorFiSp               ;kein Speicher
  1679.     move.l  d0,a0                   ;File Speicher
  1680.     move.l  PrefsFileHandle(a5),d1  ;File Addr.
  1681.     move.l  a0,d2                   ;Buffer, wo das eingelesen wird
  1682.     move.l  Filegroesse(a5),d3      ;wieviel Bytes
  1683.     move.l  DOSBase(a5),a6          ;DOS
  1684.     jsr     _LVORead(a6)            ;File Lesen
  1685. SchliesseFile
  1686.     move.l  PrefsFileHandle(a5),d1  ;File Addr.
  1687.     move.l  DOSBase(a5),a6          ;DOS
  1688.     jsr     _LVOClose(a6)           ;File schliessen
  1689.     rts
  1690. ErrorFiSp
  1691.     moveq   #28,d7           ;28=kein Speicher für Prefs
  1692.     bra.s   SchliesseFile
  1693. OpenFileError
  1694.     moveq   #24,d7           ;24=konnte File BangerMenu.prefs nicht öffnen
  1695.     rts
  1696. nixPrefs
  1697.     moveq   #27,d7           ;27=Prefs vorhanden aber leer
  1698.     bra.s   SchliesseFile
  1699. ;;
  1700. ** Library Öffnen + Schliessen
  1701. LibOeffne
  1702.     move.l  a5,a4               ;Intuition Vari.
  1703.     lea     intname(pc),a1      ;Intuition String
  1704.     bsr.s   OeffneLib           ;Routine OpenLibrary
  1705.     lea     dosname(pc),a1      ;Dos String
  1706.     bsr.s   OeffneLib
  1707.     lea     gadname(pc),a1      ;Gadtools String
  1708.     bsr.s   OeffneLib
  1709.     lea     gfxname(pc),a1      ;Graphics String
  1710.     bsr.s   OeffneLib
  1711.     rts
  1712. OeffneLib
  1713.     moveq   #37,d0              ;Ver. 37 (Kick 2.04)
  1714.     jsr     _LVOOpenLibrary(a6) ;Öffne Library
  1715.     move.l  d0,(a4)+            ;Addr. Speichern
  1716.     beq.s   LibError            ;Fehler ?
  1717.     rts
  1718. LibError
  1719.     moveq   #22,d7              ;22 = konnte Library nicht öffnen
  1720.     rts
  1721. LibSchliesse
  1722.     move.l  4.w,a6              ;ExecBase
  1723.     moveq   #4-1,d2             ;4 Libraries Schliessen
  1724.     lea     WindowHandle(a5),a4
  1725. SchliesseLib
  1726.     move.l  -(a4),a1            ;Angefangen mit GfxBase
  1727.     cmp.l   #0,a1               ;Addr. gleich 0
  1728.     beq.s   notOpened           ;Ja dann Lib war nicht geöffnet
  1729.     jsr     _LVOCloseLibrary(a6) ;Schliesse Library
  1730. notOpened
  1731.     dbra    d2,SchliesseLib     ;Solange bis alle 4 Libraries geschlossen
  1732.     rts
  1733. ;;
  1734. ** PubScreenOeffne
  1735. PubScreenOeffne
  1736.     tst.l   MonitorKey(a5)      ;MonitorTreiber
  1737.     beq.w   StdPal              ;Nein dann PAL
  1738.     tst.l   MoniID(a5)          ;MonitorID nr. vorhanden
  1739.     bne.s   IDistDa             ;ja
  1740.     moveq   #32,d7              ;32=fehlender Parameter
  1741.     rts
  1742. IDistDa
  1743.     move.l  MonitorKey(a5),d1   ;MonitorTreiber Name
  1744.     moveq   #0,d2               ;kein Input
  1745.     moveq   #0,d3               ;kein Output
  1746.     move.l  DOSBase(a5),a6      ;DOS Library Funktion
  1747.     jsr     _LVOExecute(a6)     ;Programm Ausführen
  1748.     tst.l   d0                  ;Programm OK ?
  1749.     bne.s   NeuenMonitor        ;JA
  1750.     moveq   #34,d7              ;34=konnte MonitorTreiber Datei nicht laden
  1751.     rts
  1752. NeuenMonitor
  1753.     move.l  MoniID(a5),a4       ;MonitorID Nr.
  1754.     move.l  (a4),d0
  1755.     move.l  GFXBase(a5),a6      ;Graphics Base Funktion
  1756.     jsr     _LVOFindDisplayInfo(a6) ;Finde DisplayInfoHandle zur IDNr.
  1757.     tst.l   d0                  ;Auflösung gefunden ?
  1758.     bne.s   MonitorDa           ;JA!
  1759.     moveq   #35,d7              ;35=Monitor mit angebenen ID nicht gefunden
  1760.     rts
  1761. MonitorDa
  1762.     move.l  4.w,a6              ;EXECBase
  1763. keinSignal
  1764.     moveq   #-1,d0              ;Irgenein freies Signal
  1765.     jsr     _LVOAllocSignal(a6) ;Besetze Signal
  1766.     move.b  d0,ScreenSignal(a5) ;SignalNr
  1767.     bmi.b   keinSignal          ;kein Siganlfrei warte
  1768.     lea     MyScreenTags(pc),a1 ;ScreenTags
  1769.     lea     PubScTitle(pc),a0   ;ScreenTitel eintragen
  1770.     move.l  a0,4(a1)
  1771.     move.l  MoniID(a5),a4       ;Auflösung eintragen
  1772.     move.l  (a4),12(a1)
  1773.     moveq   #0,d0
  1774.     move.b  ScreenSignal(a5),d0 ;ScreenSignal eintragen
  1775.     move.l  d0,20(a1)
  1776.     lea     PenArray(pc),a0     ;PenArray Struktur eintragen
  1777.     move.l  a0,28(a1)
  1778.     suba.l  a0,a0               ;kein NewScreen Struktur
  1779.     move.l  INTUIBase(a5),a6    ;Intuition Base Funktion
  1780.     jsr     _LVOOpenScreenTagList(a6) ;Öffne neuen Screen
  1781.     move.l  d0,ScreenHandle(a5) ;ScreenAddr.
  1782.     bne.s   Pubvorgucken        ;Screen OK!
  1783.     moveq   #36,d7              ;36=konnte Screen nicht öffnen
  1784.     rts
  1785. Pubvorgucken
  1786.     move.l  d0,a0               ;ScreenAddr.
  1787.     moveq   #0,d0               ;Public Screen
  1788.     jsr     _LVOPubScreenStatus(a6) ;Screen Status setzen
  1789.     move.w  d0,d1               ;erfolgreich ?
  1790.     beq.b   keinPubScreen       ;NEIN
  1791.     lea     PubScTitle(pc),a0   ;ScreenTitel
  1792.     bra.s   Pubgucken
  1793. StdPal
  1794.     suba.l  a0,a0               ;StartScreen (Workbench)
  1795. Pubgucken
  1796.     move.l  INTUIBase(a5),a6    ;Intuition Base Funktion
  1797.     jsr     _LVOLockPubScreen(a6) ;Lock Screen
  1798.     tst.l   d0                  ;Fehler ?
  1799.     beq.s   keinPubScreen       ;JA
  1800.     move.l  d0,ScreenHandle(a5) ;ScreenAddr.
  1801.     move.l  d0,a0
  1802.     move.w  sc_Height(a0),SCHoehe(a5) ;Screen Höhe
  1803.     move.w  sc_Width(a0),SCBreite(a5) ;Screen Breite
  1804.     sub.w   #20,SCBreite(a5)    ;Höhe-32
  1805.     sub.w   #50,SCHoehe(a5)     ;Breite-80
  1806.     move.l  sc_Font(a0),a1      ;FontAttr Struktur
  1807.     move.w  ta_YSize(a1),d2     ;Font Größe
  1808.     add.b   sc_WBorTop(a0),d2   ;+ ScreenTitleBorder Größe
  1809.     addq    #1,d2               ;+1
  1810.     move.b  d2,RelativeTopC(a5) ;Relative Ecke von Oben
  1811.     move.b  sc_WBorTop(a0),RelativeLeftC(a5) ;Relative Ecke von Links
  1812.     suba.l  a1,a1               ;keine Tags
  1813.     move.l  GADBase(a5),a6      ;GadTools Base Funktion
  1814.     jsr     _LVOGetVisualInfoA(a6) ;Besorge VisualInfo
  1815.     move.l  d0,VisualInfo(a5)   ;VisualInfo Addr.
  1816.     bne.s   VisualOK            ;OK!
  1817. keinPubScreen
  1818.     moveq   #23,d7              ;23=GetVisualInfo Fehler
  1819. VisualOK
  1820.     rts
  1821. ScreenSchliesse
  1822.     move.l  GADBase(a5),a6      ;GadTools Base Funktion
  1823.     move.l  VisualInfo(a5),a0   ;VisualInfo Addr.
  1824.     jsr     _LVOFreeVisualInfo(a6) ;Gebe VisualInfo frei
  1825. ScrSchliesse
  1826.     move.l  INTUIBase(a5),a6    ;Intuition Base Funktion
  1827.     suba.l  a0,a0               ;kein Name
  1828.     move.l  ScreenHandle(a5),a1 ;Screen Struktur
  1829.     jsr     _LVOUnlockPubScreen(a6) ;Unlock Screen
  1830.     cmp.b   #10,d7              ;BangerMenu führt Batchdatei aus
  1831.     beq.s   ScreenBleibt
  1832.     move.l  ScreenHandle(a5),a0 ;ScreenAddr.
  1833.     jsr     _LVOCloseScreen(a6) ;Schliesse Screen
  1834. ScreenBleibt
  1835.     rts
  1836. ;;
  1837. ** LONG Daten
  1838. SystemExeTags
  1839.         dc.l    SYS_Input,0
  1840.         dc.l    SYS_Output,0
  1841.         dc.l    SYS_Asynch,-1
  1842.         dc.l    SYS_UserShell,-1
  1843.         dc.l    TAG_DONE
  1844. Fenster_Tags
  1845.         dc.l    WA_Title,0
  1846.         dc.l    WA_Gadgets,0
  1847.         dc.l    WA_ScreenTitle,0
  1848.         dc.l    WA_Width,0
  1849.         dc.l    WA_Height,0
  1850.         dc.l    WA_Top,11
  1851.         dc.l    WA_Left,0
  1852.         dc.l    WA_PubScreen,0
  1853.         dc.l    WA_IDCMP,IDCMP_MENUPICK!IDCMP_CLOSEWINDOW!IDCMP_VANILLAKEY!IDCMP_REFRESHWINDOW!BUTTONIDCMP!RAWKEY
  1854.         dc.l    WA_Flags,WFLG_ACTIVATE!WFLG_SMART_REFRESH!WFLG_DRAGBAR!WFLG_DEPTHGADGET!WFLG_CLOSEGADGET
  1855.         dc.l    WA_NewLookMenus,-1
  1856.         dc.l    WA_AutoAdjust,-1
  1857.         dc.l    TAG_DONE
  1858. MyScreenTags
  1859.         dc.l    SA_PubName,0
  1860.         dc.l    SA_DisplayID,0
  1861.         dc.l    SA_PubSig,0
  1862.         dc.l    SA_Pens,0
  1863.         dc.l    SA_Type,WBENCHSCREEN
  1864.         dc.l    SA_Width,STDSCREENWIDTH
  1865.         dc.l    SA_Height,STDSCREENHEIGHT
  1866.         dc.l    SA_Depth,2
  1867.         dc.l    SA_SysFont,1
  1868.         dc.l    SA_Overscan,OSCAN_TEXT
  1869.         dc.l    TAG_DONE
  1870. UniGad
  1871.         dc.w    20,20,0,10
  1872.         dc.l    0,0
  1873.         dc.w    0
  1874.         dc.l    PLACETEXT_IN,0,0 
  1875. PageGads
  1876.         dc.w    20,5,14,12
  1877.         dc.l    0,0
  1878.         dc.w    10000
  1879.         dc.l    PLACETEXT_IN,0,0
  1880. Page2Gads
  1881.         dc.w    40,5,14,12
  1882.         dc.l    0,0
  1883.         dc.w    10001
  1884.         dc.l    PLACETEXT_IN,0,0
  1885. PaGadTags
  1886.         dc.l    GA_Disabled,1
  1887. PaGadTags2
  1888.         dc.l    GT_Underscore,'_'
  1889.         dc.l    TAG_DONE
  1890. MenuTags
  1891.         dc.l    GTMN_NewLookMenus,1
  1892.         dc.l    TAG_END
  1893. topaz8:
  1894.         dc.l    0
  1895.         dc.w    8
  1896.         dc.b    0,1
  1897. PenArray
  1898.         dc.w    -1
  1899. EndeReq
  1900.         dc.l    EasyStruct_SIZEOF
  1901.         dc.l    0,0,0,0
  1902. ;;
  1903. ** BYTE Daten
  1904. ParaTemplate    dc.b 'FN=PREFSFILENAME/K,MT=MONITORTREIBER/K,MONITORID/K/N,NOKEY/S',0
  1905. intname         INTNAME
  1906. dosname         DOSNAME
  1907. gadname         GADTOOLSNAME
  1908. gfxname         GRAFNAME
  1909. AbReqTi         dc.b    'About the program:',0
  1910. AbReqTxt        dc.b    'BangerMenu is giftware',10
  1911.                 dc.b    'Autor: Andre´ Trettin',10
  1912.                 dc.b    '       Duwockskamp 33',10
  1913.                 dc.b    '       21029 Hamburg',10
  1914.                 dc.b    '       040/7246861',10
  1915.                 dc.b    '       Germany',10,10
  1916.                 dc.b    '   EMail: tretti-a@rzbt.fh-hamburg.de',10
  1917.                 dc.b    'Homepage: demnächst',10,10
  1918.                 dc.b    'Greeting all how sent me a EMail about BangerMenu',10
  1919.                 dc.b    '        and all my friends',0
  1920. AbGadTxt        dc.b    'OK',0
  1921. ProjektName     dc.b    'Project',0
  1922. InfoName        dc.b    'About',0
  1923. QuitName        dc.b    'Quit',0
  1924. InfoTaste       dc.b    'A',0
  1925. QuitTaste       dc.b    'Q',0
  1926. PubScTitle      dc.b    'Workbench Screen',0
  1927. PageLeftTxt     dc.b    '_<',0
  1928. PageRightTxt    dc.b    '_>',0
  1929. inputname       dc.b    'input.device',0
  1930. PrefsFileName   dc.b    'S:'
  1931. PrefsFile1      dc.b    'BangerMenu.prefs',0
  1932. topazFName8     dc.b    'topaz.font',0
  1933. WindowTitle     dc.b    'BangerMenu',0
  1934.                 dc.b    '$VER: '
  1935. ScreenTitle     dc.b    'BangerMenu 3.3 (4-Sep-96) © by Andre´ Trettin',0
  1936. AysnchOut       dc.b    'CON:0/0/640/200/BangerMenu Ausgabe/auto/wait/close',0
  1937. ;;
  1938.